Laravel 5.6 Фасад / Псевдоним не регистрируется / работает - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь создать свой собственный Фасад и зарегистрироваться с помощью пользовательского сервисного контейнера и, наконец, создать собственный псевдоним для этого фасада.

Я не уверен, какая часть не работает, возможно, есть проблема с регистрацией сервисного контейнера или с псевдонимом?

Начнем с моего фасада:

/**
 *
 * @see \App\Library\Facades\ViewWrapper\CustomView
*/
class CustomViewFacade extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'customview';
    }
}

Мой класс CustomView с логикой и функцией show

namespace App\Library\Facades\ViewWrapper;

...

class CustomView
{
    public function show(...) { ... }

    ...
} 

Мой CustomViewServiceProvider

namespace App\Providers;

...  

class CustomViewServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton(CustomViewFacade::class);
        $this->app->alias(CustomViewFacade::class, 'customview');
    }
}

Как мне зарегистрировать провайдера в config\app.php

App\Providers\CustomViewServiceProvider::class,

Как создать псевдоним в config\app.php

'CustomView' => App\Library\Facades\ViewWrapper\CustomViewFacade::class

В моем контроллере я использую фасад так:

use CustomView;

...

public function show(ImageRequest $imagerequest)
{
    return CustomView::show(...);
}

Я получаю следующую ошибку в контроллере:

Класс 'CustomView' не найден

Что я здесь не так делаю?

EDIT

После очистки конфигурации и дампа автозагрузки композитора я получаю следующую ошибку:

вызов неопределенного метода App \ Library \ Facades \ ViewWrapper \ CustomViewFacade :: show ()

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Я думаю, вы не совсем ясно поняли, как работают Фасады. Это простой способ получить доступ к вашим услугам, не сталкиваясь с внедрением зависимостей. Я не фанат этой методологии, но вот как вы делаете это правильно.

  1. Вам необходимо привязать ваш фактический сервис к контейнеру, а не к фасаду. Фасад - это почти просто символическая ссылка на ваш сервис в контейнере.
  2. Вам необходимо импортировать реальный сервис, а не фасад. Laravel автоматически свяжет вашу зависимость в переменную с подсказкой типа, благодаря своей закулисной магии.

Использование:

use App\Library\Facades\ViewWrapper\CustomView;

(небольшое примечание: ваше пространство имен здесь должно быть пространством имен вашего сервиса, помните, что не следует смешивать семантику между фасадом и сервисом. Сервис содержит логику, а фасад является просто средством доступа к сервису, который уже внедрен. это важно !!)

Вместо:

use CustomView;

Это должно решить проблему.

Кроме того, я бы посоветовал вам определить, как класс должен создаваться и внедряться в контейнере службы, используя Closure в функции bootstrap.

class CustomViewServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton(CustomView::class, function () {
            return new CustomView(...);
        );
    }
}

Кроме того, функция псевдонима не требуется в вашем случае. Это просто позволит вам получить доступ к службе с помощью клавиши customview в контейнере службы.

Просто определите Фасад в файле config / app.php.

Еще одно небольшое предложение: используйте селекторы класса PHP 7 вместо строк в определении вашего аксессора фасада. Например: CustomView::class целое число customview. Это делает ваш код аккуратнее и проще для чтения.

0 голосов
/ 07 января 2019

Пожалуйста, запустите команду ниже и проверьте:

php artisan config:cache

php artisan cache:clear
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...