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

Php 如何在Symfony中以编程方式获取服务列表?,php,symfony,Php,Symfony,我想在我的web应用程序中有一个服务和类名的列表。我可以在控制台中使用此命令: php bin/console debug:container 我得到了这样的结果: Symfony Container Public Services ================================= -------------------------------------------------------------------- ---------------------------

我想在我的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
$definition = $container->getDefinition('service_name')
$definition->getClass();
我想在使用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_类,但无论您遇到什么错误,都将来自对这些服务的不正确获取。毕竟,当您调用$container->get…,它就在此时实例化这些类

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

您只需要调整它以适应您的工作。

当我阅读它时,您对get_类的尝试就是我想到的,但是您所遇到的任何错误都将来自对这些服务的不正确获取。毕竟,当您调用$container->get…,它就在此时实例化这些类

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


您只需对其进行调整以适应您的需要。

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

ContainerBuilder的第一个创建实例:

$container = new ContainerBuilder();
然后加载缓存文件:

$cachedFile = $this->container->getParameter('debug.container.dump');
$loader = new XmlFileLoader($container, new FileLocator());
$loader->load($cachedFile);
现在,您可以像下面这样获得服务的完整定义:

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
$definition = $container->getDefinition('service_name')
$definition->getClass();

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

ContainerBuilder的第一个创建实例:

$container = new ContainerBuilder();
然后加载缓存文件:

$cachedFile = $this->container->getParameter('debug.container.dump');
$loader = new XmlFileLoader($container, new FileLocator());
$loader->load($cachedFile);
现在,您可以像下面这样获得服务的完整定义:

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
$definition = $container->getDefinition('service_name')
$definition->getClass();