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



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

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

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

我试着检查Doctrine代码看看hit是如何工作的,但是我没有发现。

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

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

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

此外,即使Symfony将交付所有src/dirs,遍历它们并检查每个请求的所有实体类是否有一些注释,也会非常低效。所以这些信息肯定被缓存了。但是这些信息是什么时候收集的,等等。

简而言之:关于如何实现像@Entity这样的注释,有什么标准的程序吗?

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

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

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

Doctrine知道安装了哪些Bundle以及在哪里查找,这要感谢Doctrine Symfony Bundle,并且默认情况下总是在相同的位置查找已定义的映射。但是,即使它只查看这些bundle中的特定目录(扫描这些目录),它也不会"知道所有已定义的类"。

使用像get_declared_classes()这样的东西是行不通的,因为不是所有的类都必须在给定的时间为给定的请求读取。一些/许多类将被加载,这些类与你的用例无关。同样,试图依赖其他系统做了类似的事情,并留下了某种缓存:因为那些库/包正在寻找与你不同的东西,他们的结果可能不相关。

即使配置告诉应用程序在哪里查找,通常也不会在运行时对每个请求执行此操作,因为这太昂贵了。作为Doctrine或Symfony的包/框架这样做一次,然后"缓存";结果是不同类型的配置文件和代理类。

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

相关内容

  • 没有找到相关文章

最新更新