Динамически зарегистрируйте несколько классов в сервис-провайдере - PullRequest
1 голос
/ 18 октября 2019

У меня есть несколько ModuleServiceProvider в папке разных модулей, и я пытаюсь динамически зарегистрироваться в одном RootServiceProvider.

ModuleServiceProvider

public function register()
{
  $this->app->bind(CategoryRepositoryInterface::class, CategoryRepository::class);
}

вот мой код в rootServiceProvider

public function boot()
{
  foreach(glob(app_path().'/Azam/Modules/*/Providers/*.php') as $provider) {
     $this->app->register($provider);
  }
}

и ошибка, которую я получаю

Class '/Users/.../Desktop/Developments/Codes/project/app/Azam/Modules/Categories/Providers/CategoryServiceProvider.php 'не найден

мой путь к файлу выглядит хорошо.

1 Ответ

1 голос
/ 18 октября 2019

Метод register() предполагает полное имя класса, а не путь к файлу.

Вы можете использовать стандартную стратегию определения местоположения и именования для своих поставщиков услуг, чтобы зациклить их на основеимя модуля:

/** @var \Illuminate\Filesystem\Filesystem $filesystem */
$filesystem = $this->app->make('files');

foreach ($files->directories(app_path('Azam/Modules')) as $directory) {
    $directoryName = last(explode('/', $directory));


    $this->app->register("App\\Azam\\Modules\\{$directoryName}\\{$directoryName}ServiceProvider");
}

Или, если вы хотите создать глобальный модуль и найти каких-либо поставщиков услуг с любым конкретным именем, вам нужно будет найти классы в каждом файле и определить, расширяют ли они Illuminate\Support\ServiceProvider class или иметь конкретный суффикс имени (например, ServiceProvider).

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