如何在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中获取控制器的所有路由列表?的主要内容,如果未能解决你的问题,请参考以下文章

symfony2 控制器的功能测试:如何生成路由

symfony2 获取路由参数(控制器参数与请求)

如何在 symfony 2 中获取根路由

如何使用 Symfony2 路由组件将路由与控制器绑定

Symfony2 - 在 TWIG 模板中获取当前 URL 或路由?

如何在 Symfony 2 中获取当前路线?