Laravel-外观说明和代码示例

时间:2019-02-09 16:01:24

标签: laravel

每当我们调用Facade方法时,它都涉及Facade设计模式,并使用Facade调用某些隐藏类。例如File(如果我们调用

File::get(public_path().'test.txt');

这将调用类中的方法

Illuminate\Filesystem\Filesystem

,在该类中,我们将使用get($ path)方法。

现在我的问题是Facade Abstract Class与File和Filesystem的关系以及Laravel告诉他们在Filesystem中调用get的地方。我缺少某种寄存器吗?我想找到完整的链接。

1 个答案:

答案 0 :(得分:2)

如果您进入config/app.php,您会发现有一个名为aliases的数组,看起来像这样

'aliases' => [
    // 
    //
    //
    //
    'File' => Illuminate\Support\Facades\File::class, 
]; 

因此,基本上,每当您调用File时,Service Container都会尝试解析Illuminate\Support\Facades\File::class的一个实例,它只是一个Facade。

如果您查看Illuminate\Support\Facades\File::class,则会发现它仅包含一种方法:

class File extends Facade
{
    /**
    * Get the registered name of the component.
    *
    * @return string
    */
    protected static function getFacadeAccessor()
    {
        return 'files';
    }
}

如您所见,它扩展了Facade类,并且每当解决Facade问题时,Laravel都会尝试在Service Container中找到与返回的值相等的 key getFacadeAccessor()

如果您查看Illuminate\Filesystem\FilesystemServiceProvider的来源,则会看到以下内容:

$this->app->singleton('files', function () {
    return new Filesystem;
});

如您所见,键files被绑定到FileSystem实现。因此,这就是Laravel知道如何解决File门面的方式。