每当我们调用Facade方法时,它都涉及Facade设计模式,并使用Facade调用某些隐藏类。例如File(如果我们调用
File::get(public_path().'test.txt');
这将调用类中的方法
Illuminate\Filesystem\Filesystem
,在该类中,我们将使用get($ path)方法。
现在我的问题是Facade Abstract Class与File和Filesystem的关系以及Laravel告诉他们在Filesystem中调用get的地方。我缺少某种寄存器吗?我想找到完整的链接。
答案 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
门面的方式。