Symfony 2/3在实现接口的目录中获取类

时间:2016-04-21 15:12:50

标签: php symfony

在Symfony 2或3中有一个很好的方法来加载实现特定接口的目录中的所有类吗?

2 个答案:

答案 0 :(得分:1)

简短的回答是:你不能。

在加载文件之前,您不知道文件中包含的内容。

长答案(考虑到你在问题评论中所写的内容):

在加载文件之前,您唯一知道的就是它的名称。因此,解决方案之一是命名您的模块'具有固定模式的类(和文件),如UserModuleProductModule等。这样您就可以按名称加载所有模块。 但这是我不建议的解决方案。

我认为你应该改变方法并改变工作流程。创建一个类,您将在其中定义需要加载的所有模块。在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]

如果需要限制服务从单个目录注册,请参阅使用资源导入

参考: