如何扩展Laravel Storage外观?

时间:2017-03-12 06:00:06

标签: php laravel laravel-5 laravel-facade

根据我的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:方法磁盘不存在。

2 个答案:

答案 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.