2012-02-16 11 views
2

特定のルートに関する情報をその名前で取得することも、すべてのルートのリストを取得することもできますか?Symfony 2:ルート名でルートのデフォルトを取得する方法は?

defaultsの値を_controllerの値を、現在のルートだけでなく、どのルートでも取得できるようにする必要があります。

これは可能ですか?

P .:私は、YAMLが使用されているルートへのパスを得ることができましたが、再解析することは不要で重いようです。

答えて

5

私はルートはルータ(コントローラ内部の$this -> get('router') -> getRouteCollection())にgetRouteCollection()を使用取得するには...

を私自身の質問に答えるのは本当に良いです、そして、あなたがall()缶やget($name)上RouteCollectionインスタンスを取得します。

+4

'getRouteCollection'はキャッシュを再構築することを意図しているので、キャッシュされた値は使用しません。だから、それを呼び出すことは非常にお勧めです。運用コードでの使用を意図したものではなく、パフォーマンスに大きな影響を与えます(「実行時にキャッシュされないYMLルーティングローダーについての議論」(https://github.com/symfony/symfony/issues/7368#issuecomment-15146130を参照)。 ))。 – flu

+0

...私は本当に自分の答えを見つけることができます... – flu

0

上記の私のコメントに記載されているように、Router::getRouteCollectionは実際には遅く、プロダクションコードでの使用を意図していません。

あなたが本当にそれを速く必要とするなら、あなたはそれを邪魔する必要があります。これはハックになるだろう、警告が表示さ:


直接ルートのマッチングをスピードアップするためにダンプされたルートデータ

にアクセスし、symfonyは一つの大きなPHPクラスファイルにすべてのスタティックルートをコンパイルします。このファイルはSymfony\Component\Routing\Generator\Dumper\PhpGeneratorDumperによって生成され、すべてのルート定義を$declaredRoutesというプライベートスタティックに格納するSymfony\Component\Routing\Generator\UrlGeneratorと宣言します。

$declaredRoutesは、ルート名で索引付けされたコンパイル済みルートフィールドの配列です。これらのフィールドには、ルートのデフォルト値も含まれています(下記参照)。

$declaredRoutesにアクセスするには、\ReflectionPropertyを使用する必要があります。

ので、実際のコードである:

// If you don't use a custom Router (e.g., a chained router) you normally 
// get the Symfony router from the container using: 
// $symfonyRouter = $container->get('router'); 
// After that, you need to get the UrlGenerator from it. 
$generator = $symfonyRouter->getGenerator(); 

// Now read the dumped routes. 
$reflectionProperty = new \ReflectionProperty($generator, 'declaredRoutes'); 
$reflectionProperty->setAccessible(true); 
$dumpedRoutes = $reflectionProperty->getValue($generator); 

// The defaults are at index #1 of the route array (see below). 
$routeDefaults = $dumpedRoutes['my_route'][1]; 

ルートアレイのフィールド各経路の

フィールドは、上記に充填され、このようなSymfony\Component\Routing\Generator\Dumper\PhpGeneratorDumperを挙げる:

// [...] 
$compiledRoute = $route->compile(); 

$properties = array(); 
$properties[] = $compiledRoute->getVariables(); 
$properties[] = $route->getDefaults(); 
$properties[] = $route->getRequirements(); 
$properties[] = $compiledRoute->getTokens(); 
$properties[] = $compiledRoute->getHostTokens(); 
$properties[] = $route->getSchemes(); 
// [...] 

したがって、そのrequiremにアクセスするにはあなたが使用するエント:

$routeRequirements = $dumpedRoutes['my_route'][2]; 

ボトムライン

私はsymfonyのマニュアル、ソースコード、フォーラム、stackoverflowのなどを通じて見えたが、まだ見つけることができませんでしたしましたこれを行うより良い方法。

残念ながら、APIを無視しています。最新のSymfony 3.4:​​では変更されていませんが、今後のアップデートでは破損する可能性があります。

しかし、生産に使用するには、かなり短く高速です。

関連する問題