如何在带有特定注释的 Symfony 项目中找到所有 类?

How to find all classes in Symfony project with specific annotation?

使用 Symfony 5.3 我想在项目中找到所有使用自定义注释 @MyAnnotation.

的 classes

虽然我找到了无数教程和大量关于注释的信息,但它们都展示了如何检查给定对象或方法是否使用了某些注释。例如使用内核事件订阅者来测试当前控制器是否使用注解是没有问题的。

但我无法找到一种方法来自动查找/发现所有使用给定注释的 classes。我假设 Doctrine 本身会做同样的事情来找到所有使用其 @Entity 注释的实体。 但是这是怎么做到的呢?

我试图检查 Doctrine 代码以了解 hit 是如何工作的,但我没有找到。

是否有一些内置功能?或者是否有一些 giveMeAllClassesInProject() 方法可以用来手动测试每个 class?

在项目中遍历 所有 classes 是不切实际的。我不必主动告诉 Doctrine MyBundle 已安装在项目中并且它可以在 /vendor/me/my-bundle/src/Entity 找到它的实体,但 Doctrine 确实 找到这些实体。

当然 src/Entity/ 部分是标准的并且很确定属于 Doctrines 默认配置,但是 Doctrine 仍然需要知道安装了哪些 bundle,在哪里可以找到它们,在哪里可以找到项目 src/ 目录等。所以在这个方向上需要一些 giveMeAlleSrcDirsInProject() 方法或其他东西,不是吗?

此外,即使 Symfony 会提供所有 src/ 目录,遍历它们并检查所有实体 classes 以在每个请求上进行一些注释也是非常低效的。所以这个信息肯定是以某种方式缓存的。但是这些信息是什么时候收集的等等

简而言之:是否有关于如何实现注解的标准程序,如@Entity

您需要遍历项目中存在的所有 类,并检查每个项目是否以某种方式进行注释。

通常这是不切实际的,所以你会有(像 Doctrine 或 Symfony 那样)配置设置告诉你的代码在哪里寻找那些 类。

然后您只扫描那些文件,仅此而已。

多亏了 Doctrine Symfony Bundle,Doctrine 知道安装了哪些包以及在哪里查看,并且默认情况下总是在相同的位置查找定义的映射。但即便如此,它也只查看这些包中的特定目录(扫描这些目录),它并不“了解所有已定义的 类”。

使用 get_declared_classes() 之类的东西是行不通的,因为对于给定请求,并非所有 类 都必须在给定时间读取。 some/many 类 将加载与您的用例无关的内容。与尝试依赖其他执行类似操作并留下某种缓存的系统相同:因为那些 libraries/packages 正在寻找与您不同的东西,他们的结果可能不相关。

即使配置告诉应用程序在哪里查看,这通常也不会在每个请求的运行时完成,因为它太昂贵了。 Packages/Frameworks 作为 Doctrine 或 Symfony 这样做一次并将结果“缓存”在不同种类的配置文件和代理中 类。

要遍历目录并检查其中的文件,也许您可​​以使用 Symfony Finder。您一定会在网上找到 many 个示例。确切的实施将取决于您的应用程序所做的不同假设。