【问题标题】:How to find all classes in Symfony project with specific annotation?如何在 Symfony 项目中找到所有带有特定注释的类?
【发布时间】:2021-10-26 10:24:38
【问题描述】:

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

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

但我无法找到一种方法来自动查找/发现所有使用给定注释的类。我假设 Doctrine 本身在查找所有使用其 @Entity 注释的实体方面也是如此。 但是这是怎么做到的呢?

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

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

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

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

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

简而言之: 有没有关于如何实现@Entity 等注解的标准程序?

【问题讨论】:

  • “但是这是怎么做到的呢?” Doctrine 知道在哪里搜索实体,在配置文件中定义
  • 你想要的不存在。您需要遍历目录。您可以尝试依赖执行类似操作的其他系统,但由于他们会在不同的地方寻找不同的配置,因此他们可能找不到您想要的所有内容。
  • 没有,也不可能有任何giveMeAlleSrcDirsInProject()

标签: symfony annotations doctrine


【解决方案1】:

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

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

然后你只扫描那些文件,就是这样。

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

使用像get_declared_classes() 这样的东西是行不通的,因为对于给定的请求,并不是所有的类都必须在给定的时间读取。并且将加载一些/许多与您的用例无关的类。与尝试依赖执行类似操作并留下某种缓存的其他系统相同:由于这些库/包正在寻找与您不同的东西,因此它们的结果可能不相关。

即使配置告诉应用程序在哪里寻找,这通常不会在运行时对每个请求进行,因为它太昂贵了。作为 Doctrine 或 Symfony 的包/框架会这样做一次,并将结果“缓存”在不同类型的配置文件和代理类中。

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

【讨论】:

  • 似乎您的答案是在我编辑问题时添加的。我回答了我添加的大部分问题。谢谢!我将仔细查看链接。
  • 您的编辑没有改变我的答案,抱歉。我不明白“我回答了我添加的大部分问题”。你是在回答这个问题吗?如何?无论如何,答案都是一样的:你需要扫描你感兴趣的目录,并以某种方式定义它。
  • 抱歉,应该是“回答了我添加的大部分问题......”(不是我)。主要问题是“是否有关于如何实现 @Entity? 之类的注释的标准程序”使用某种“神奇的”getAllClasses()”方法只是一个假设。我认为答案很简单“不,没有标准程序/最佳实践如何实现这种类型的注释”。
  • 如前所述,答案是“否”,您需要通过扫描文件和检查类来实现自己的。
猜你喜欢
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
相关资源
最近更新 更多