Laravel facade __constructor()用法

Mos*_*ebi 1 php laravel

我上了课.类的构造函数为类属性赋值.

这是定义:

class myClass 
{
    private $_value;

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

    function echoThat ()
    {
        echo $this->_value;
    }
}
Run Code Online (Sandbox Code Playgroud)

常规用法是:

$x = new myClass("SimpleString");
$x->echoThat();
Run Code Online (Sandbox Code Playgroud)

但是我已经把这个类变成了Laravel中的一个外观类,所以使用它:

myClass::echoThat();
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*der 7

如果您真的想使用像Laravel外墙这样的类,那么您应该只创建一个Laravel外观.Laravel外墙为班级提供静态界面.

这意味着重写您的类,以便您可以以任何其他方式传递您的字符串,如:

MyClassFacade::echoThat('SimpleString');
Run Code Online (Sandbox Code Playgroud)

当然,您也可以修改要使用的基础类,例如传递字符串的另一种方法:

class MyClass 
{
    private $_value;

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

        return $this;
    }

    public function echoThat()
    {
        echo $this->_value;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后把它称为:

MyClassFacade::setValue('SimpleString')->echoThat();
Run Code Online (Sandbox Code Playgroud)

如果在解析了Laravel外观访问器的位置(例如在服务提供者中)实例化您的类,则可以"静态"调用该类的非静态方法:

use Illuminate\Support\ServiceProvider;

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

} 
Run Code Online (Sandbox Code Playgroud)

Laravel将创建一个实例,MyClass无论何时使用静态调用类上的方法__callStatic.

或者不要使用Laravel外观并像手动一样手动实现你的类:

$x = new myClass("SimpleString");
$x->echoThat(); 
Run Code Online (Sandbox Code Playgroud)


Ant*_*iro 5

你首先要明白,在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');
    }

}
Run Code Online (Sandbox Code Playgroud)

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

App::make('myclass')->echoThat();
Run Code Online (Sandbox Code Playgroud)

现在您还可以创建Facade来使用它:

<?php namespace App\MyApp;

use Illuminate\Support\Facades\Facade as IlluminateFacade;

class ExtendedRouteFacade extends IlluminateFacade {

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

}
Run Code Online (Sandbox Code Playgroud)

Facade只有一个方法,其唯一目的是在IoC容器中返回类实例的名称.

现在您可以打开app/config/app.php并添加ServiceProvider:

'App\MyApp\MyClassServiceProvider',
Run Code Online (Sandbox Code Playgroud)

实际的Facade别名:

'MyClass' => 'App\MyApp\MyClassFacade',
Run Code Online (Sandbox Code Playgroud)

你最好使用你的Facade:

echo MyClass::echoThat();
Run Code Online (Sandbox Code Playgroud)

但是请注意,它的制作方式__constructor将始终使用相同的参数调用,在ServiceProvider中,这就是Facade的工作方式,但您有一些选择:

使用setter为类实例中的数据设置新值.

public function setValue($value)
{
    $this->_value = $value;
}
Run Code Online (Sandbox Code Playgroud)

使用Laravel自动类分辨率为您的类提供参数:

function __construct (MyFooClass $foo)
{
     $this->_foo = $foo;
}
Run Code Online (Sandbox Code Playgroud)

并更改您的ServiceProvider以为您的类提供任何参数:

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

Laravel会MyFooClass自动为您实例化,如果它可以在应用程序的可用源代码中找到它,或者它是否绑定到IoC容器.

请注意,所有这些都假设您不只是在构造函数中传递字符串,IoC容器的自动解析假定您的类具有其他类依赖性并自动注入这些依赖项(依赖注入).

如果你真的只需要将字符串或单个值传递给只进行一些计算的类的构造函数,那么你真的不需要为它们创建Facade,你可以:

$x = (new myClass("SimpleString"))->echoThat();
Run Code Online (Sandbox Code Playgroud)

使用简单的setter:

$x = new myClass();
$x->setValue("SimpleString");
$x->echoThat();
Run Code Online (Sandbox Code Playgroud)

或者,正如您已经在做的那样,这是可以接受的:

$x = new myClass("SimpleString");
$x->echoThat();
Run Code Online (Sandbox Code Playgroud)

您还可以使用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();
    }

}
Run Code Online (Sandbox Code Playgroud)

Laravel会自动传递你的课程实例,你可以按照你需要的方式使用它:

$post = new Post;

echo $post->doWhateverAction("SimpleString");
Run Code Online (Sandbox Code Playgroud)