Symofny2 Получите список доступных логических имен контроллеров

Мне нужно показать выбор со списком всех доступных контроллеров, поскольку логические имена AcmeBundle:ControllerName:ActionName

Я вижу, что команда CLI php app/console router:debug выгружает аналогичный список, но с именами контроллеров, например fos_user_security_login .

Как я могу спросить Symfony о представлении имени логического контроллера?

Благодаря!

Как сказал @hous, этот пост был полезен, но был неполным и его принятый ответ вводил в заблуждение.

A) Получение контроллеров

С помощью этого кода я получаю все контроллеры, но с их FQCN::method или service:method .

 // in a Controller. $this->container->get('router')->getRouteCollection()->all() 

Некоторые предпосылки

Предыдущий метод вернет большой массив маршрутов. Выполняется одно ключевое значение => значение:

 'admin_chacra' => // route name object(Symfony\Component\Routing\Route)[1313] ... private 'defaults' => array (size=1) '_controller' => string 'Application\ColonizacionBundle\Controller\ChacraController::indexAction' (length=71) 

FQCN::method является правильным аргументом метода сборки ControllerNameParser :: build (). Нотация службы не анализируется, так как она обрабатывается следующим кодом в ControllerResolver :: createController () `

  $count = substr_count($controller, ':'); if (2 == $count) { // controller in the a:b:c notation then /* @var $this->parser ControllerNameParser parse() is the oposite of build()*/ $controller = $this->parser->parse($controller); } elseif (1 == $count) { // controller in the service:method notation list($service, $method) = explode(':', $controller, 2); return array($this->container->get($service), $method); } else { throw new \LogicException(sprintf('Unable to parse the controller name "%s".', $controller)); } 

B) Создание имен логических контроллеров

Так что все, что мне нужно сделать, это отфильтровать контроллеры, которых я не хочу, {FOS; фреймворка; etc} и feed build() с каждым выбранным. Например, выбирая только атрибуты _controller, которые соответствуют моему пространству имен Application\*Bundle в моем случае.

Вот сборка docBlock

 /** * Converts a class::method notation to a short one (a:b:c). * * @param string $controller A string in the class::method notation * * @return string A short notation controller (a:b:c) * * @throws \InvalidArgumentException when the controller is not valid or cannot be found in any bundle */ 

Моя реализация

 use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser; class ActivityRoleControllerType extends AbstractType { ... /** * Controller choices * * @var array */ private static $controllers = array(); /** * Controller Name Parser * * @var ControllerNameParser */ private $parser; /** * expects the service_container service */ public function __construct(ContainerInterface $container) { $this->parser = new ControllerNameParser($container->get('kernel')); self::$controllers = $this->getControllerLogicalNames( $container->get('router')->getRouteCollection()->all(), $this->parser ); } /** * Creates Logical Controller Names for all controllers under \Application\* * namespace. * * @param Route[] $routes The routes to iterate through. * @param ControllerNameParser $parser The Controller Name parser. * * @return array the ChoiceType choices compatible array of Logical Controller Names. */ public function getControllerLogicalNames(array $routes, ControllerNameParser $parser) { if (! empty(self::$controllers)) { return self::$controllers; } $controllers = array(); /* @var $route \Symfony\Component\Routing\Route */ foreach ($routes as $route) { $controller = $route->getDefault('_controller') if (0 === strpos($controller, 'Application\\')) { try { $logicalName = $parser->build($controller); $controllers[$logicalName] = $logicalName; } catch (\InvalidArgumentException $exc) { // Do nothing, invalid names skiped continue; } } } asort($controllers); return $controllers; } }