如何在Symfony中以编程方式获取服务列表?

时间:2017-05-24 13:18:22

标签: php symfony

我希望在我的Web应用程序中有一个服务和类名列表。我可以在控制台中使用此命令:




  php bin / console debug:container
  

&# xA;

我得到这样的东西:




  Symfony Container Public Services
 ============= ====================

 -------------------------------------------------- ------------------ -------------------------------- -------------------------------------------------- ----------
服务ID类名称
 -------------------------------------------------- ------------------ -------------------------------- -------------------------------------------------- ----------
 annotation_reader Doctrine \ Common \ Annotations \ CachedReader
 app.annotations.softdelete.driver AppBundle \ Doctrine \ SoftDelete \ Mapping \ Driver \ Annotation
 app.annotations.translate.driver AppBundle \ Doctrine \ Mapping \ Driver \ TranslateDriver
 app.be_auth_controller.listener AppBundle \ EventListener \ BeAuthControllerListener
  




我想在使用Symfony 3的网页上获取此信息。





我创建了一项服务并使用了:




  $ this-> container-> getServiceIds(); 
  




返回类似于:




  [&#xA ; 0 => “service_container” 
 1 => “annotation_reader” 
 2 => “annotations.reader” 
 3 => “app.annotations.softdelete.driver” 
 4 => “app.annotations.translate.driver”
 ...
]
  




我不知道,如何获取类名。





在任何情况下都可以这样工作:




  get_class($ this - >容器 - >获得($这 - >容器 - > getServiceIds()[1]))
  




但是在其他一些情况下,它会抛出不同的例外。





你有什么想法吗?





谢谢。




2 个答案:

答案 0 :(得分:3)

我在阅读时会想到get_class的尝试,但是你得到的任何错误都来自于不正确地获取这些服务。毕竟当你打电话给$container->get(...)时,它会在那一刻实例化那些类。

老实说,您要复制的输出可以根据该命令使用的方法进行复制。

https://github.com/symfony/framework-bundle/blob/master/Command/ContainerDebugCommand.php

你只需要让它适应你。

答案 1 :(得分:1)

要获得给定服务的完整定义,您可以使用ContainerBuilder和Symfony缓存文件。

首先创建ContainerBuilder的实例:

$container = new ContainerBuilder();

然后加载缓存文件:

$cachedFile = $this->container->getParameter('debug.container.dump');
$loader = new XmlFileLoader($container, new FileLocator());
$loader->load($cachedFile);

现在您可以像这样获得服务的完整定义:

$definition = $container->getDefinition('service_name')
$definition->getClass();