Как расширить фасад Laravel Storage?

Не зная, как работают фасады Laravel, на основе моих знаний PHP я попытался расширить фасад Storage, добавив некоторые новые функции.

У меня есть этот код:

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');

Я получаю эту ошибку:

FatalThrowableError в строке 237 Facade.php: вызов неопределенного метода Namespace \ MyStorage \ MyStorage :: disk ()

Также попытался расширить MyStorage форму Illuminate\Filesystem\Filesystem и получил ту же ошибку другим способом:

BadMethodCallException в строке 74 Macroable.php: Диск метода не существует.


person Omid    schedule 12.03.2017    source источник


Ответы (2)


Ваш MyStorage класс должен расширять FilesystemManager, а не класс фасада Storage.

class MyStorage extends \Illuminate\Filesystem\FilesystemManager {
    ....
}
person Paras    schedule 12.03.2017

Фасад - это просто вспомогательный класс, который преобразует статический вызов Facade::method в resolove("binding")->method (более или менее). Вам нужно расширить файловую систему, зарегистрировать ее в IoC, сохранить фасад как есть и использовать фасад как статический.

Фасад:

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. 
person apokryfos    schedule 12.03.2017
comment
Как я уже упоминал, я проверил его и получил эту ошибку: BadMethodCallException in Macroable.php line 74: Method disk does not exist. - person Omid; 12.03.2017
comment
Хотя @Omid disk на самом деле нигде не определен. - person apokryfos; 12.03.2017
comment
Так как же \Storage::disk('local') работает в таком случае? @apokryfos - person Omid; 12.03.2017
comment
Я думаю, что это связано с классом FilesystemManager, а не с классом FileSystem. Обновил код. - person apokryfos; 12.03.2017
comment
Вы правы, теперь он работает. Однако странно, что средство доступа к фасаду возвращает filesystem. @apokryfos - person Omid; 12.03.2017
comment
Это сложно. Проверьте источник класса Application на github. com / laravel / framework / blob / 5.4 / src / Illuminate / Foundation /, чтобы увидеть все встроенные привязки, если вы сомневаетесь в том, что возвращает фасад. - person apokryfos; 12.03.2017
comment
Это вообще не работает ... пытаясь понять это часами ... Не могли бы вы обновить свой ответ, указав пространство имен / использование и где на самом деле поместить bind ()? Это было бы полезно, спасибо! - person emotality; 11.03.2018
comment
@emotality Я основывал их на настройке OP. Во всяком случае, я обновил его, надеюсь, теперь он имеет больше смысла - person apokryfos; 11.03.2018