Laravel facade __构造函数()用法

9avjhtql  于 2023-02-20  发布在  其他
关注(0)|答案(3)|浏览(147)

我创建了一个类。类的构造函数为类的属性赋值。
定义如下:

class myClass 
{
    private $_value;

    function __construct ($input)
    {
        $this->_value = $input;
    }

    function echoThat ()
    {
        echo $this->_value;
    }
}

其常规用法为:

$x = new myClass("SimpleString");
$x->echoThat();

但是我已经把类变成了Laravel中的一个门面类型的类,所以它被使用:

myClass::echoThat();

我应该如何像上面的例子一样在Laravel Facades中使用__construct()方法?

omhiaaxx

omhiaaxx1#

只有当你真的想像使用Laravel facade那样使用你的类时,你才应该创建一个Laravel facade。Laravel facade为类提供一个静态接口。
这意味着要么重写你的类,这样你就可以用其他方式传递你的字符串,比如:

MyClassFacade::echoThat('SimpleString');

当然,您也可以修改底层类,例如使用另一个方法来传递字符串:

class MyClass 
{
    private $_value;

    public function setValue($val) 
    {
        $this->_value = $val;

        return $this;
    }

    public function echoThat()
    {
        echo $this->_value;
    }
}

然后叫它:

MyClassFacade::setValue('SimpleString')->echoThat();

如果在解析Laravel facade访问器的任何地方示例化类,例如在服务提供程序中,则可以“静态”调用类的非静态方法:

use Illuminate\Support\ServiceProvider;

class MyClassServiceProvider extends ServiceProvider 
{
    public function register()
    {
        $this->app->bind('myclass', function()
        {
            return new MyClass();
        });
    }

}

只要使用__callStatic静态调用类上的方法,Laravel就会创建MyClass的示例。
或者不要使用Laravel facade,而是像您所做的那样手动示例化类:

$x = new myClass("SimpleString");
$x->echoThat();
yizd12fk

yizd12fk2#

你首先要明白,在Laravel中,一个Facade并不是你真正的类,你必须把它看作,正如它的名字所说,你的类的前沿或正面。Facade实际上是你的类的一个服务定位器。
要使用此服务定位器,您必须创建一个服务提供程序,它将提供Facade使用的服务:

<?php namespace App\MyApp;

use Illuminate\Support\ServiceProvider;

class MyClassServiceProvider extends ServiceProvider {

    protected $defer = true;

    public function register()
    {
        $this->app['myclass'] = $this->app->share(function() 
        { 
            return new MyClass('the values you need it to instantiate with');
        });
    }

    public function provides()
    {
        return array('myclass');
    }

}

请注意,您的类是在方法register()中示例化的,现在可以通过IoC容器供应用程序使用,因此您可以执行以下操作:

App::make('myclass')->echoThat();

现在你也可以创建你的门面来使用它:

<?php namespace App\MyApp;

use Illuminate\Support\Facades\Facade as IlluminateFacade;

class ExtendedRouteFacade extends IlluminateFacade {

    protected static function getFacadeAccessor() 
    { 
        return 'myclass'; 
    }

}

Facade只有一个方法,它的唯一用途是返回IoC容器中的类示例的名称。
现在,您可以打开app/config/app.php并添加ServiceProvider:

'App\MyApp\MyClassServiceProvider',

还有实际的门面别名:

'MyClass' => 'App\MyApp\MyClassFacade',

你应该很好地使用你的门面:

echo MyClass::echoThat();

但请注意,在ServiceProvider中,类__constructor的创建方式将始终使用相同的参数进行调用,这是Facade的工作方式,但您有一些选项:
使用setter为类示例中的数据设置新值。

public function setValue($value)
{
    $this->_value = $value;
}

使用Laravel自动类解析来动态地为类提供参数:

function __construct (MyFooClass $foo)
{
     $this->_foo = $foo;
}

并修改ServiceProvider,以便为类提供无参数

$this->app['myclass'] = $this->app->share(function() 
{ 
    return new MyClass();
});

如果Laravel可以在应用程序的可用源代码中找到MyFooClass,或者它绑定到IoC容器,它将自动为您示例化MyFooClass
请注意,所有这些都假设您不只是在构造函数中传递字符串,IoC容器的自动解析假设您的类具有其他类依赖项,并自动注入这些依赖项(依赖项注入)。
如果你真的只需要传递字符串或单个值给类的构造函数,而这些构造函数只需要执行一些计算,你并不真的需要为它们创建Facade,你只需要:

$x = (new myClass("SimpleString"))->echoThat();

使用简单的设置器:

$x = new myClass();
$x->setValue("SimpleString");
$x->echoThat();

或者,就像你已经在做的,这是可以接受的:

$x = new myClass("SimpleString");
$x->echoThat();

您还可以使用IoC容器在其他类中示例化该类:

<?php

class Post {

    private $myClass;

    public function __construct(MyClass $myClass)
    {
        $this->myClass = $myClass;
    }

    public function doWhateverAction($value)
    {
        $this->myClass->setValue($value);

        // Do some stuff...

        return $this->myClass->echoThat();
    }

}

Laravel会自动传递类的一个示例,您可以按照需要使用它:

$post = new Post;

echo $post->doWhateverAction("SimpleString");
q9yhzks0

q9yhzks03#

我在此页面http://laravel.com/docs/eloquent中找到了一些关于Facade Lavarel FW中模型类的良好信息
我想这是关于你的问题的主要解释,在数据库中创建一个输入的方法。

// Create a new user in the database...
$user = User::create(array('name' => 'John'));

// Retrieve the user by the attributes, or create it if it doesn't exist...
$user = User::firstOrCreate(array('name' => 'John'));

// Retrieve the user by the attributes, or instantiate a new instance...
$user = User::firstOrNew(array('name' => 'John'));

下面是创建一个简单的新示例并初始化其变量的方法:

$user = new User;

$user->name = 'John';

$user->save();

基于此,我假设在Lavarel中没有使用构造函数的明确方法。

相关问题