在Symfony 2或3中有一个很好的方法来加载实现特定接口的目录中的所有类吗?
答案 0 :(得分:1)
在加载文件之前,您不知道文件中包含的内容。
在加载文件之前,您唯一知道的就是它的名称。因此,解决方案之一是命名您的模块'具有固定模式的类(和文件),如UserModule
,ProductModule
等。这样您就可以按名称加载所有模块。 但这是我不建议的解决方案。
我认为你应该改变方法并改变工作流程。创建一个类,您将在其中定义需要加载的所有模块。在Symfony中,它默认调用AppKernel
,您可以在其中定义要加载和初始化的包(模块)。
这有一些优点。
您可以为应用程序提供多个入口点,并使用不同的模块配置每个入口点。
您可能有一些不同的环境(如生产和开发),两者都加载了不同的模块。 (例如在开发中添加一些模块,如分析器)
此外,依赖管理也更容易,因为您可以加载已定义的模块并使用自动加载添加其依赖项。
一般情况下,我认为您应该避免手动加载任何php文件(autoload.php
除外或包含自动加载器的类似文件)。
答案 1 :(得分:1)
自Symfony 3.3 / 3.4起,仅通过使用配置即可(无需编写自定义CompilerPass):
# config/services.yaml
services:
# ...
_instanceof:
App\HandlerInterface:
tags: ['app.handler']
App\HandlerCollection:
# inject all services tagged with app.handler as first argument
arguments: [!tagged app.handler]
如果需要限制服务从单个目录注册,请参阅使用资源导入
参考: