繁体   English   中英

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

[英]How to get a list of services programmatically in Symfony?

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

php bin/console debug:container

我得到这样的东西:

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

 -------------------------------------------------------------------- --------------------------------------------------------------------------------------------
  Service ID                                                           Class name
 -------------------------------------------------------------------- --------------------------------------------------------------------------------------------
  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();

它返回如下内容:

[
  0 => "service_container"
  1 => "annotation_reader"
  2 => "annotations.reader"
  3 => "app.annotations.softdelete.driver"
  4 => "app.annotations.translate.driver"
...
]

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

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

get_class($this->container->get($this->container->getServiceIds()[1]))

但在其他一些情况下,它会抛出不同的异常。

我在阅读它时想到了您对get_class尝试,但是无论您遇到什么错误,都将来自对这些服务的不当获取。 毕竟,当您调用$container->get(...) ,它正在实例化这些类。

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

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

您只需要调整它以适合您。

要获得给定服务的完整定义,您可以使用 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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM