Разработка пакета Laravel: псевдоним фасада не найден

Я пытаюсь создать псевдоним для фасада в пакете Laravel 7.

При тестировании я получаю сообщение:

Ошибка: класс MemberRequest не найден

Тестовое задание:

    /** @test */
    public function a_member_request_can_be_created()
    {
        $this->assertDatabaseMissing('member_requests', ['created_at' => Date::now()]);
        \MemberRequest::create(new CreateMemberRequestRequest(['email_address' => $this->email_address]));
        $this->assertDatabaseHas('member_requests', ['created_at' => Date::now()]);
    }

Я сделал следующие шаги:

  • создать фасад (расширение класса фасада из Laravel Illuminate
  • Зарегистрируйте его у поставщика услуг
  • добавить псевдоним в файл конфигурации
  • добавить псевдоним в файл composer.json

Создайте фасад:

namespace martijn\UMS\Repositories\Facades;

use Illuminate\Support\Facades\Facade;

class MemberRequestRepositoryFacade extends Facade
{
    public static function getFacadeAccessor()
    {
        return 'MemberRequest';
    }
}

Зарегистрируйтесь в serviceProvider:

namespace martijn\UMS\Providers;


use Illuminate\Support\ServiceProvider;
use martijn\UMS\Repositories\MemberRequestRepository;

class UMSBaseServiceProvider extends ServiceProvider
{
public function register()
    {
        $this->registerFacades();
    }

    private function registerFacades()
    {
        // Facades
        $this->app->singleton('MemberRequest', function () {
            return new MemberRequestRepository();
        });
    }
}

Добавьте его в файл конфигурации:

return [


    /*
    |--------------------------------------------------------------------------
    | Class Aliases
    |--------------------------------------------------------------------------
    |
    | This array of class aliases will be registered when this application
    | is started. However, feel free to register as many as you wish as
    | the aliases are "lazy" loaded so they don't hinder performance.
    |
    */

    'aliases' => [
        'MemberRequest' => \martijn\UMS\Repositories\Facades\MemberRequestRepositoryFacade::class,
    ]
];

Добавьте его в composer.json:

      "aliases": {
        "MemberRequest": "martijn\\UMS\\Repositories\\Facades\\MemberRequestRepositoryFacade"
      }

person Madriesen    schedule 29.04.2020    source источник


Ответы (2)


В вашем ServiceProvider попробуйте вот так:

$this->app->singleton('MemberRequest', function () {
   return new MemberRequestRepository;
});
person Rafael    schedule 29.04.2020
comment
Та же ошибка: ›Ошибка: класс« MemberRequest »не найден. - person Madriesen; 29.04.2020

Я выяснил, что это делается в загрузчике сервис-провайдера вот так:

https://laracasts.com/discuss/channels/laravel/dynamic-class-aliases-in-package

В моем примере это было:

$loader = AliasLoader::getInstance();
$loader->alias('MemberRequest', \martijn\UMS\Repositories\Facades\MemberRequestRepositoryFacade::class);
person Madriesen    schedule 29.04.2020