如何在Symfony2中获取控制器的所有路由列表?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Symfony2中获取控制器的所有路由列表?相关的知识,希望对你有一定的参考价值。
我有一个控制器,它实现所有路由/ URL。我有想法在所有帮助页面上提供通用索引。
有没有办法在Symfony2
中获得控制器(在控制器内)定义的所有路径?
您可以获取所有路由,然后从中创建一个数组,然后将该控制器的路由传递给您的树枝。
它不是一个漂亮的方式,但它的工作..对于2.1反正..
/** @var $router SymfonyComponentRoutingRouter */
$router = $this->container->get('router');
/** @var $collection SymfonyComponentRoutingRouteCollection */
$collection = $router->getRouteCollection();
$allRoutes = $collection->all();
$routes = array();
/** @var $params SymfonyComponentRoutingRoute */
foreach ($allRoutes as $route => $params)
{
$defaults = $params->getDefaults();
if (isset($defaults['_controller']))
{
$controllerAction = explode(':', $defaults['_controller']);
$controller = $controllerAction[0];
if (!isset($routes[$controller])) {
$routes[$controller] = array();
}
$routes[$controller][]= $route;
}
}
$thisRoutes = isset($routes[get_class($this)]) ?
$routes[get_class($this)] : null ;
你可以做的是使用cmd(最高SF2.6)
php app/console router:debug
使用SF 2.7命令是
php app/console debug:router
使用SF 3.0命令是
php bin/console debug:router
它显示了所有路线。
如果你为每个控制器定义一个前缀(我推荐),你可以使用
php app/console router:debug | grep "<prefixhere>"
显示所有匹配的路线
要显示获取控制器中的所有路由,基本上具有相同的输出,我将在控制器中使用以下内容(它与路由器中使用的方法相同:symfony组件中的debug命令)
/**
* @Route("/routes", name="routes")
* @Method("GET")
* @Template("routes.html.twig")
*
* @return array
*/
public function routeAction()
{
/** @var Router $router */
$router = $this->get('router');
$routes = $router->getRouteCollection();
foreach ($routes as $route) {
$this->convertController($route);
}
return [
'routes' => $routes
];
}
private function convertController(SymfonyComponentRoutingRoute $route)
{
$nameParser = $this->get('controller_name_converter');
if ($route->hasDefault('_controller')) {
try {
$route->setDefault('_controller', $nameParser->build($route->getDefault('_controller')));
} catch (InvalidArgumentException $e) {
}
}
}
routes.html.twig
<table>
{% for route in routes %}
<tr>
<td>{{ route.path }}</td>
<td>{{ route.methods|length > 0 ? route.methods|join(', ') : 'ANY' }}</td>
<td>{{ route.defaults._controller }}</td>
</tr>
{% endfor %}
</table>
输出将是:
/_wdt/{token} ANY web_profiler.controller.profiler:toolbarAction
等
我正在寻找这样做,在搜索代码之后,我想出了这个适用于单个控制器(或实际上任何资源)的解决方案。适用于Symfony 2.4(我没有使用以前的版本进行测试):
$routeCollection = $this->get('routing.loader')->load('PathToControllerClass');
foreach ($routeCollection->all() as $routeName => $route) {
//do stuff with Route (SymfonyComponentRoutingRoute)
}
如果有人在这个问题上磕磕绊绊,这就是我在全球树枝范围内导出路线的方式(symfony 4)。
src/Helper/Route.php
<?php
namespace AppHelper;
use SymfonyComponentRoutingRouterInterface;
class Routes
{
private $routes = [];
public function __construct(RouterInterface $router)
{
foreach ($router->getRouteCollection()->all() as $route_name => $route) {
$this->routes[$route_name] = $route->getPath();
}
}
public function getRoutes(): array
{
return $this->routes;
}
}
src/config/packages/twig.yaml
twig:
globals:
route_paths: '@AppHelperRoutes'
Then in your twig file to populate a javascript variable to use in your scripts
<script>
var Routes = {
{% for route_name, route_path in routes_service.routes %}
{{ route_name }}: '{{ route_path }}',
{% endfor %}
}
</script>
在Symfony 4中,我希望将所有路径(包括控制器和操作)放在一个列表中。在rails中,您可以默认使用此功能。
在Symfony中,您需要将参数show-controllers
添加到debug:router
命令。
如果有人寻找相同的功能,它可以得到:
bin/console debug:router --show-controllers
这将生成如下列表
------------------------------------------------------------------------- -------------------------------------
Name Method Scheme Host Path Controller
------------------------------------------------------------------------- -------------------------------------
app_some_good_name ANY ANY ANY /example/example ExampleBundle:Example:getExample
------------------------------------------------------------------------- -------------------------------------
以上是关于如何在Symfony2中获取控制器的所有路由列表?的主要内容,如果未能解决你的问题,请参考以下文章