首页 > 解决方案 > 在服务提供者中动态注册多个类

问题描述

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);
  }
}

和我得到的错误

找不到类“/Users/.../Desktop/Developments/Codes/project/app/Azam/Modules/Categories/Providers/CategoryServiceProvider.php”

我的文件路径看起来不错。

标签: phplaravelproviderservice-providerlaravel-6.2

解决方案


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类,或者具有特定的名称后缀(例如ServiceProvider)。


推荐阅读