Как настроить фасады в Laravel 5.2 (вне / app)
Я спрашиваю / отвечаю, потому что у меня было так много проблем с этим, и я хотел бы показать пошаговую инструкцию реализация.
ссылки:
1 ответов
это может быть не только способ реализации фасадов в Laravel 5, но вот как я это сделал.
мы собираемся создать пользовательскую Foo фасад доступен в разделе Foobar пространство имен.
1. Создайте пользовательский класс
во-первых, для этого примера я буду создавать новую папку в своем проекте. Он получит свой собственный пространство имен это облегчит поиск.
в моем случае каталог называется Foobar:
в здесь, мы создадим новый PHP-файл с определением класса. В моем случае, я назвал это Foo.php.
<?php
// %LARAVEL_ROOT%/Foobar/Foo.php
namespace Foobar;
class Foo
{
public function Bar()
{
return 'got it!';
}
}
2. Создайте класс фасада
в нашей новой папке мы можем добавить новый PHP-файл для нашего фасада. Я собираюсь назвать это FooFacade.php, и я кладу его в другое пространство имен под названием Foobar\Фасады. имейте в виду, что пространство имен в этом случае не отражает структуру папок!
<?php
// %LARAVEL_ROO%/Foobar/FooFacade.php
namespace Foobar\Facades;
use Illuminate\Support\Facades\Facade;
class Foo extends Facade
{
protected static function getFacadeAccessor()
{
return 'foo'; // Keep this in mind
}
}
- имейте в виду, что вы вернетесь в
getFacadeAccessorкак вам это понадобится через минуту.
Также обратите внимание, что вы расширяете существующее фасад класс здесь.
3. Создайте нового провайдера с помощью php artisan
так теперь нам нужен причудливый новый провайдер. К счастью, у нас есть удивительный . В моем случае, я позвоню это FooProvider.
php artisan make:provider FooProvider
БАМ! у нас есть поставщик. подробнее о поставщиках услуг здесь. пока просто знайте, что он имеет две функции (boot и register), и мы добавим некоторые код register. Мы собираемся bind наш новый поставщик нашего приложения:
$this->app->bind('foo', function () {
return new Foo; //Add the proper namespace at the top
});
это bind('foo' часть на самом деле будет соответствовать тому, что вы положили в свой FooFacade.php код. Где я сказал return 'foo'; прежде чем я хочу, чтобы эта привязка соответствовала этому. (Если бы я сказал return 'wtv'; я бы сказал bind('wtv', здесь.)
кроме того, мы должны сказать, что Laravel, где найти Foo!
Итак, вверху мы добавляем пространство имен
use \Foobar\Foo;
проверить весь файл так:
<?php
// %LARAVEL_ROOT%/app/Providers/FooProvider.php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Foobar\Foo;
class FooProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->app->bind('foo', function () {
return new Foo;
});
}
}
- убедитесь, что вы используете
Foobar\Foo, а неFoobar\Facades\Foo- ваша IDE может предложить неправильное завершение.
4. Добавьте Наши ссылки на config/app.php
теперь мы должны сказать Laravel, что мы заинтересованы в использовании этих случайных файлов, которые мы только что создали, и мы можем сделать это в нашем .
добавьте ссылку на класс поставщика в
'providers':App\Providers\FooProvider::classдобавьте ссылку на класс фасада в
'aliases':'Foo' => Foobar\Facades\Foo::class
помню, в псевдонимы, где я писал 'Foo', вы хотите поставить имя, которое вы хотите ссылаться на свой фасад с Там. Поэтому, если вы хотите использовать MyBigOlFacade::helloWorld() вокруг вашего приложения вы начнете эту строку с 'MyBigOlFacade' => MyApp\WhereEverMyFacadesAre\MyBigOlFacade::class
5. Обновите свой composer.json
последнее изменение кода вам нужно обновить composer.json ' s psr-4 пробелы. Вам придется добавить следующее:
"psr-4": {
"Foobar\" : "Foobar/",
// Whatever you had already can stay
}
окончательное решение
Итак, теперь, когда вы все это изменили, последнее, что вы необходимо обновить кэши как в composer, так и в artisan. Попробуйте это:
composer dumpautoload
php artisan cache:clear
Использование И Быстрый Тест:
создать маршрут в app/routes.php:
Route::get('/foobar', 'FooBarController@testFoo');
затем запустите
php artisan make:controller FooBarController
и добавьте код, чтобы теперь он выглядел так:
<?php
namespace App\Http\Controllers;
use Foobar\Facades\Foo;
use App\Http\Requests;
class FooBarController extends Controller
{
public function testFoo()
{
dd(Foo::Bar());
}
}
вы должны закончить следующие строки:
устранение неисправностей
-
если вы в конечном итоге и ошибка говорит, что он не может найти класс
Foobar\Facades\Foo, попробуйphp artisan optimize

