Как настроить фасады в Laravel 5.2 (вне / app)

Я спрашиваю / отвечаю, потому что у меня было так много проблем с этим, и я хотел бы показать пошаговую инструкцию реализация.

ссылки:

1 ответов


это может быть не только способ реализации фасадов в Laravel 5, но вот как я это сделал.

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

1. Создайте пользовательский класс

во-первых, для этого примера я буду создавать новую папку в своем проекте. Он получит свой собственный пространство имен это облегчит поиск.

в моем случае каталог называется Foobar:

enter image description here

в здесь, мы создадим новый 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, что мы заинтересованы в использовании этих случайных файлов, которые мы только что создали, и мы можем сделать это в нашем .

  1. добавьте ссылку на класс поставщика в 'providers': App\Providers\FooProvider::class

  2. добавьте ссылку на класс фасада в '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());
    }
}

вы должны закончить следующие строки:

enter image description here


устранение неисправностей

  • если вы в конечном итоге и ошибка говорит, что он не может найти класс Foobar\Facades\Foo, попробуй php artisan optimize