web-dev-qa-db-ja.com

Symfony2でコントローラーのすべてのルートのリストを取得する方法は?

すべてのroutes/URL(s)を実装するコントローラーがあります。私は、すべてのヘルプページに汎用インデックスを提供するというアイデアを思いつきました。

Symfony2のコントローラーによって(コントローラー内から)定義されたすべてのルートを取得する方法はありますか?

45
Sammy

すべてのルートを取得し、そこから配列を作成し、そのコントローラーのルートをTwigに渡すことができます。

それはきれいな方法ではありませんが、動作します。

    /** @var $router \Symfony\Component\Routing\Router */
    $router = $this->container->get('router');
    /** @var $collection \Symfony\Component\Routing\RouteCollection */
    $collection = $router->getRouteCollection();
    $allRoutes = $collection->all();

    $routes = array();

    /** @var $params \Symfony\Component\Routing\Route */
    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 ;
25
qooplmao

あなたができることは、(SF2.6まで)でcmdを使用することです

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コンポーネントのrouter: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(\Symfony\Component\Routing\Route $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など.

117
DerStoffel

私はそれをやろうとしていましたが、コードを検索した後、単一のコントローラー(または実際にはリソース)で機能するこのソリューションを思いつきました。 Symfony 2.4で動作します(以前のバージョンではテストしませんでした):

$routeCollection = $this->get('routing.loader')->load('\Path\To\Controller\Class');

foreach ($routeCollection->all() as $routeName => $route) {
   //do stuff with Route (Symfony\Component\Routing\Route)
}
19
yancg

誰かがこの問題に出くわした場合、これがグローバルtwigスコープ(symfony 4)のルートをエクスポートする方法です。

src/Helper/Route.php

<?php

namespace App\Helper;

use Symfony\Component\Routing\RouterInterface;

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: '@App\Helper\Routes'

次に、twigファイルで、スクリプトで使用するjavascript変数を設定します

<script>
    var Routes = {
        {% for route_name, route_path in routes_service.routes %}
            {{ route_name }}: '{{ route_path }}',
        {% endfor %}
    }
</script>
3
C Alex

Symfony 4では、コントローラーとアクションを含むすべてのルートを1つのリストにまとめたいと思いました。 Railsではデフォルトでこれを取得できます。

Symfonyでは、パラメーターshow-controllersdebug: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
------------------------------------------------------------------------- -------------------------------------
0
rob