前回、'index.php/2013/1/2/3'でルーティングした際にはcontrollerやactionがありませんでした。
これでは'index.php/a/b/1'の場合と揃えて、
$controller = new {$route->values['controller']};
$controller->{$route->values['action']};
とか書けません。
そこでパラメータやパース方法については別途設定することができます。
前者はadd()の第三引数にvaluesを指定しています。
match()で引っかかったときに、valuesを指定した値も一緒に帰ってくるようになります。
URLにコントローラやアクションを指定せずとも、任意のコントローラに振り分けることができるようになりました。
後者は、URLの形式と正規表現を別々に指定しています。
こちらの表記の方が、普通の正規表現なのでわかりやすいと思います。
最後、ブログの閲覧、更新など複数のルーティングを一括登録する方法です。
#全然関係ないけどSymfonyは今まで使ったことがあるFWの中で最も使いにくい
AuraPHPの記事
これでは'index.php/a/b/1'の場合と揃えて、
$controller = new {$route->values['controller']};
$controller->{$route->values['action']};
とか書けません。
そこでパラメータやパース方法については別途設定することができます。
<?php
require_once('path/to/channel/vendor/autoload.php');
// Router
$router = new Aura\Router\Map(
new Aura\Router\DefinitionFactory()
,new Aura\Router\RouteFactory()
);
// パラメータの追加
$router->add(
'date1'
,'/{:year:(\d+)}/{:month:(\d+)}/{:day:(\d+)}'
,array('values' => array(
'controller' => 'date', 'action' => 'read'
))
);
// パース方法を別途設定
$router->add(
'date2'
,'/{:year}{:month}{:day}'
,array('params' => array(
'year' => '(\d\d\d\d)', 'month' => '(\d\d)', 'day' => '(\d\d)'
))
);
// パース
$route = $router->match($_SERVER['PATH_INFO'], $_SERVER);
// 'index.php/2013/1/2' でアクセスした場合
$route->name; // date1
$route->values; // array('controller'=>'date', 'action'=>'read', 'year'=>'2013', 'month'=>'1', 'day'=>'2')
// 'index.php/20130102' でアクセスした場合
$route->name; // date2
$route->values; // array('year'=>'2013', 'month'=>'01', 'day'=>'02')
まずadd()の使用方法の拡張をふたつ。前者はadd()の第三引数にvaluesを指定しています。
match()で引っかかったときに、valuesを指定した値も一緒に帰ってくるようになります。
URLにコントローラやアクションを指定せずとも、任意のコントローラに振り分けることができるようになりました。
後者は、URLの形式と正規表現を別々に指定しています。
こちらの表記の方が、普通の正規表現なのでわかりやすいと思います。
最後、ブログの閲覧、更新など複数のルーティングを一括登録する方法です。
<?php
// ルーティンググループの登録
$router->attach('/blog', array(
'routes' =>array(
'blog_top' => '/'
,'blog_edit' => '/{:id:(\d+)}/edit'
,'blog_read' => array(
'path' => '/{:id}{:format}'
,'params' => array(
'id' => '(\d+)'
,'format' => '(\.json|\.atom)?'
)
,'values' => array(
'format' => '.html'
)
)
)
));
// パース
$route = $router->match($_SERVER['PATH_INFO'], $_SERVER);
// 'index.php/blog/' でアクセス
$route->name; // blog_top
$route->values; // array('action'=>'blog_top')
// 'index.php/blog/1' でアクセス
$route->name; // blog_read
$route->values; // array('action'=>'blog_read', 'format'=>'.html', 'id'=>'1')
// 'index.php/blog/1/edit' でアクセス
$route->name; // blog_edit
$route->values; // array('action'=>'blog_edit', 'id'=>'1')
sfDoctrineRouteCollectionみたいな便利おまとめルートはないので結局個別に設定が必要ですが、これでブログの作成/閲覧ルーティングがひととおりできあがりました。#全然関係ないけどSymfonyは今まで使ったことがあるFWの中で最も使いにくい
AuraPHPの記事
PR