Symfony2ルーティング 新機能

Symfony 2プレビューリリースが最近リリースされました フレームワークの2番目のブランチでルーティングシステムにどのような変更が加えられたかを説明します。


それでは始めましょう。

この記事では、symfonyでのルーティングの仕組みについては説明しません。 あなたはここでそれについて読むか、 コードを見ることができます ! 次に、フレームワークの2番目のブランチで何が変更されたかを説明します。

新機能


  1. ルーティングシステムはコンポーネントになり、フレームワークとは別に使用できるようになりました。
  2. コード自体を再設計し、パフォーマンスを改善しました。 ルーティングルールごとにオブジェクトは作成されなくなりました(もちろん、キャッシュが使用されていない限り!)。
  3. ルートとurl'aの比較時。 strpos関数が最初に(可能な場合)使用され、次にpreg_matchのみが使用されます。
  4. さまざまなオブジェクトがURLを生成し、それらを比較しています(ProjectUrlGenerator、ProjectUrlMatcher)。
  5. Symfony \ Components \ Routing \ Routerクラスのコンストラクターに適切なパラメーターを渡すことで、ルーティングシステムの任意のクラスを置き換えることができます。
  6. PHPでのルールのダンプに加えて、Apacheのダンプがあります。 必要に応じて、nginxのファイルダンパーを作成することが可能になると思います。


どうして?


  1. パターンに星を使用する機能が削除されました(またはまだ実行されていない可能性があります)。 ルール「/:module /:action / *」は以前と同様に機能しません。


以下に、新規を説明するコードのセクションを示します)。 フレームワークとは別にルーティングをテストしたため、ルール内のデータは異なりますが、本質は同じままです。 つまり、$ defaults配列は異なります。 パラメーター_bundle、_controller、_actionの代わりに、module、actionを実行しました。

Symfony 1.2のルールのダンプの例:


<?php
// auto-generated by sfRoutingConfigHandler
// date: 2010/03/14 00:46:57
return array(
'addTopic' => new sfRoute( 'blogs/add-topic/' , array (
'module' => 'blogsEdit' ,
'action' => 'addTopic' ,
), array (), array ()),
'editTopic' => new sfRoute( 'blogs/edit-topic/:id/' , array (
'module' => 'blogsEdit' ,
'action' => 'editTopic' ,
), array (), array ()),
'themeBlog' => new sfRoute( 'blogs/:name/' , array (
'module' => 'blogs' ,
'action' => 'blog' ,
), array (), array ())
// .. ..
);


* This source code was highlighted with Source Code Highlighter .

Symfony 1.4のルールのダンプの例:


<?php
// auto-generated by sfRoutingConfigHandler
// date: 2010/03/14 00:46:57

$ this ->routes[ 'route-1' ] = unserialize( ' ' );
$ this ->routes[ 'route-2' ] = unserialize( ' ' );
$ this ->routes[ 'route-6' ] = unserialize( ' ' );
$ this ->routes[ 'route-7' ] = unserialize( ' ' );
$ this ->routes[ 'route-8' ] = unserialize( ' ' );
$ this ->routes[ 'route-9' ] = unserialize( ' ' );
$ this ->routes[ 'route-10' ] = unserialize( ' ' );
$ this ->routes[ 'route-11' ] = unserialize( ' ' );
$ this ->routes[ 'route-12' ] = unserialize( ' ' );

$ this ->routes[ 'homepage' ] = unserialize( ' ' );
$ this ->routes[ 'default_index' ] = unserialize( ' ' );
$ this ->routes[ 'default' ] = unserialize( ' ' );

* This source code was highlighted with Source Code Highlighter .


Symfony 2のルーティングルールの例:


# blog
addTopic:
pattern: blogs/add-topic/
defaults: { module: blogsEdit, action: addTopic }

editTopic:
pattern: blogs/edit-topic/:id/
defaults: { module: blogsEdit, action: editTopic }

themeBlog:
pattern: blogs/:name/
defaults: { module: blogs, action: blog }


* This source code was highlighted with Source Code Highlighter .


Symfony 2のProjectUrlMatcherクラスの例:


<?php

/**
* ProjectUrlMatcher
*
* This class has been auto-generated
* by the Symfony Routing Component.
*/
class ProjectUrlMatcher extends Symfony\\Components\\Routing\\Matcher\\UrlMatcher
{
/**
* Constructor.
*/
public function __construct(array $context = array(), array $defaults = array())
{
$ this ->context = $context;
$ this ->defaults = $defaults;
}

public function match($url)
{
$url = $ this ->normalizeUrl($url);

if (0 === strpos($url, '/blogs/add-topic' ) && preg_match( '#^/blogs/add\-topic$#x' , $url, $matches))
return array_merge($ this ->mergeDefaults($matches, array ( 'module' => 'blogsEdit' , 'action' => 'addTopic' ,)), array( '_route' => 'addTopic' ));

if (0 === strpos($url, '/blogs/edit-topic' ) && preg_match( '#^/blogs/edit\-topic/(?P<id>[^/\.]+?)$#x' , $url, $matches))
return array_merge($ this ->mergeDefaults($matches, array ( 'module' => 'blogsEdit' , 'action' => 'editTopic' ,)), array( '_route' => 'editTopic' ));

if (0 === strpos($url, '/blogs' ) && preg_match( '#^/blogs/(?P<name>[^/\.]+?)$#x' , $url, $matches))
return array_merge($ this ->mergeDefaults($matches, array ( 'module' => 'blogs' , 'action' => 'blog' ,)), array( '_route' => 'themeBlog' ));

// ..

return false ;
}
}

* This source code was highlighted with Source Code Highlighter .


サンプルクラスProjectUrlGenerator Symfony 2:


<?php

/**
* ProjectUrlGenerator
*
* This class has been auto-generated
* by the Symfony Routing Component.
*/
class ProjectUrlGenerator extends Symfony\\Components\\Routing\\Generator\\UrlGenerator
{
/**
* Constructor.
*/
public function __construct(array $context = array(), array $defaults = array())
{
$ this ->context = $context;
$ this ->defaults = $defaults;
}

public function generate($name, array $parameters, $absolute = false )
{
if (!method_exists($ this , $method = 'get' .$name. 'RouteInfo' ))
{
throw new InvalidArgumentException(sprintf( 'Route "%s" does not exist.' , $name));
}

list($variables, $defaults, $tokens) = $ this ->$method();

return $ this ->doGenerate($variables, $defaults, $tokens, $parameters, $name, $absolute);
}

protected function getaddTopicRouteInfo()
{
return array(array (), array_merge($ this ->defaults, array ( 'module' => 'blogsEdit' , 'action' => 'addTopic' ,)), array ( 0 => array ( 0 => 'text' , 1 => '/' , 2 => '' , 3 => NULL, ), 1 => array ( 0 => 'text' , 1 => '/' , 2 => 'add-topic' , 3 => NULL, ), 2 => array ( 0 => 'text' , 1 => '/' , 2 => 'blogs' , 3 => NULL, ),));
}

protected function geteditTopicRouteInfo()
{
return array(array ( 'id' => ':id' ,), array_merge($ this ->defaults, array ( 'module' => 'blogsEdit' , 'action' => 'editTopic' ,)), array ( 0 => array ( 0 => 'text' , 1 => '/' , 2 => '' , 3 => NULL, ), 1 => array ( 0 => 'variable' , 1 => '/' , 2 => ':id' , 3 => 'id' , ), 2 => array ( 0 => 'text' , 1 => '/' , 2 => 'edit-topic' , 3 => NULL, ), 3 => array ( 0 => 'text' , 1 => '/' , 2 => 'blogs' , 3 => NULL, ),));
}

protected function getthemeBlogRouteInfo()
{
return array(array ( 'name' => ':name' ,), array_merge($ this ->defaults, array ( 'module' => 'blogs' , 'action' => 'blog' ,)), array ( 0 => array ( 0 => 'text' , 1 => '/' , 2 => '' , 3 => NULL, ), 1 => array ( 0 => 'variable' , 1 => '/' , 2 => ':name' , 3 => 'name' , ), 2 => array ( 0 => 'text' , 1 => '/' , 2 => 'blogs' , 3 => NULL, ),));
}
}

* This source code was highlighted with Source Code Highlighter .


Symfony 2のApacheのルールのダンプ例:


RewriteCond %{PATH_INFO} ^/blogs/add\-topic/$
RewriteRule .* index.php [QSA,L,E=_ROUTING__route:addTopic,E=_ROUTING_module:blogsEdit,E=_ROUTING_action:addTopic]

RewriteCond %{PATH_INFO} ^/blogs/edit\-topic/([^/\.]+?)/$
RewriteRule .* index.php [QSA,L,E=_ROUTING__route:editTopic,E=_ROUTING_id:%1,E=_ROUTING_module:blogsEdit,E=_ROUTING_action:editTopic]

RewriteCond %{PATH_INFO} ^/blogs/([^/\.]+?)/([^/\.]+?)/$
RewriteRule .* index.php [QSA,L,E=_ROUTING__route:topicInThemeBlog,E=_ROUTING_name:%1,E=_ROUTING_id:%2,E=_ROUTING_module:blogs,E=_ROUTING_action:topic]

* This source code was highlighted with Source Code Highlighter .


結論:
Symfonyの2番目のブランチでは、ルーティングシステムが完全に書き直されています。 かさばると思っていました。 今、私は言葉を取り戻します。 開発者が生成されたファイルを最適化し、Apacheでルールをダンプできるようになったことは非常に楽しいことです。 ルーティングシステムをフレームワークとは別に使用できるという事実は、間違いなくプラスです! 私にとって、そのようなコンポーネントは開発者の生活を向上させます!

Source: https://habr.com/ru/post/J87511/


All Articles