2016-10-01 4 views
1

Недавно начали использовать UserFrosting в качестве части проекта, и у меня возникли проблемы с использованием Facades в UserFrosting и, если возможно, по достоинству оценят некоторую помощь.Использование Laravel Facades с UserFrosting

Я пытаюсь использовать File фасад внутри контроллера UserFrosting создать папку на локальной файловой системе, используя следующий код

use Illuminate\Support\Facades\File; ...... $directoryCreated = File::makeDirectory($directoryPath);

Однако во время выполнения я получаю следующую ошибку

PHP Fatal error: Call to a member function makeDirectory() on null in /var/www/test-app/userfrosting/vendor/illuminate/support/Facades/Facade.php on line 210

Похоже, что приложение UserFrosting не распознает фасад файла (или любой другой фасад - я также попробовал Storage), и он h как не было зарегистрировано в приложении.

Можно ли использовать классы фасадов с помощью UserFrosting?

Если это так, я должен зарегистрировать их где-нибудь в конфигурации приложения UserFrosting?

Любые указатели направления были бы весьма полезными.

Заранее благодарен!

ответ

0

От Facade documentation:

Laravel «фасадов» служат в качестве «статических прокси» к базовым классам в контейнере службы ...

Таким образом, это выглядит, как фасады Laravel зависят от Laravel-х контейнер обслуживания. Вы можете узнать больше о том, как Laravel устанавливает фасады по умолчанию здесь: https://www.sitepoint.com/how-laravel-facades-work-and-how-to-use-them-elsewhere/#how-laravel-aliases-the-facades

К сожалению, UserFrosting не использует сервисный контейнер Laravel. Скорее, он использует Slim, у которого есть свой собственный контейнер обслуживания. В Slim v2 (который используется UF 0.3.1), Slim-приложение само по себе является сервисным контейнером.

Вы можете определить сервисы для UF в initialize.php. Таким образом, вы можете попробовать что-то вроде:

$app->filesystem = new \Illuminate\Filesystem\Filesystem();

потом, вы можете использовать службу файловой системы, как:

$app->filesystem->makeDirectory($directoryPath);

+0

Спасибо @alexw за это направление. Я импортировал и создавал экземпляр объекта файловой системы непосредственно в контроллере, чтобы использовать метод makeDirectory, но ваше предложение было бы более элегантным, особенно для повторного использования в другом месте. – dazoido

0

Вы можете попробовать использовать контейнер Слима, чтобы позволить Фасад разрешить его accessor (он будет использовать доступ к массиву в контейнере для его разрешения). Вы должны убедиться, что существует привязка использования фасада. Вы можете взглянуть на поставщика услуг, который соответствует сервису, который вы хотите использовать, чтобы узнать, как настроить привязку.

Фасад «File» обращается к файлам привязки (Illuminate\Filesystem\Filesystem).

\Illuminate\Support\Facades\Facade::setFacadeApplication($container); 

\Illuminate\Support\Facades\File::makeDirectory(...); 

Его ценность - выстрел, но его главным образом привязка, которая решается, что важно.

+0

Спасибо @lagbox будет исследовать этот вариант дальше. Закончилось непосредственное создание объекта файловой системы непосредственно, чтобы создать каталог, но в конечном итоге захотелось обменять между локальным и облачным хранилищем, следовательно, желание использовать Facades (File или Storage). Это может подойти мне ближе. – dazoido