すべてのroutes/URL(s)を実装するコントローラーがあります。私は、すべてのヘルプページに汎用インデックスを提供するというアイデアを思いつきました。
Symfony2
のコントローラーによって(コントローラー内から)定義されたすべてのルートを取得する方法はありますか?
すべてのルートを取得し、そこから配列を作成し、そのコントローラーのルートを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 ;
あなたができることは、(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
など.
私はそれをやろうとしていましたが、コードを検索した後、単一のコントローラー(または実際にはリソース)で機能するこのソリューションを思いつきました。 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)
}
誰かがこの問題に出くわした場合、これがグローバル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'
<script>
var Routes = {
{% for route_name, route_path in routes_service.routes %}
{{ route_name }}: '{{ route_path }}',
{% endfor %}
}
</script>
Symfony 4では、コントローラーとアクションを含むすべてのルートを1つのリストにまとめたいと思いました。 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
------------------------------------------------------------------------- -------------------------------------