Как настроить фасады в 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