根据我的PHP知识,在不知道Laravel外观是如何工作的情况下,我尝试扩展存储外观以添加一些新的功能。
我有这段代码:
class MyStorageFacade extends Facade {
/**
* Get the binding in the IoC container
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'MyStorage'; // the IoC binding.
}
}
启动服务提供商时
$this->app->bind('MyStorage',function($app){
return new MyStorage($app);
});
门面是:
class MyStorage extends \Illuminate\Support\Facades\Storage{
}
使用时:
use Namespace\MyStorage\MyStorageFacade as MyStorage;
MyStorage::disk('local');
我收到此错误:
Facade.php第237行中的FatalThrowableError:调用未定义的方法Namespace \ MyStorage \ MyStorage :: disk()
同时尝试扩展MyStorage
表单Illuminate\Filesystem\Filesystem
并以其他方式出现同样的错误:
Macroable.php第74行中的BadMethodCallException:方法磁盘不存在。
答案 0 :(得分:2)
您的MyStorage
类需要扩展FilesystemManager
而不是存储外观类。
class MyStorage extends \Illuminate\Filesystem\FilesystemManager {
....
}
答案 1 :(得分:1)
Facade只是一个便利类,可以将静态调用Facade::method
转换为resolove("binding")->method
(或多或少)。您需要从Filesystem扩展,在IoC中注册,保持您的外观不变,并将Facade用作静态。
立面:
class MyStorageFacade extends Facade {
protected static function getFacadeAccessor()
{
return 'MyStorage'; // This one is fine
}
}
您的自定义存储类:
class MyStorage extends Illuminate\Filesystem\FilesystemManager {
}
在任何服务提供商(例如AppServiceProvider
)
$this->app->bind('MyStorage',function($app){
return new MyStorage($app);
});
然后当您需要使用它时,请将其用作:
MyStorageFacade::disk(); //Should work.