忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/03/29 20:11 |
AuraPHP 1.0.0 Aura.Router その2
前回、'index.php/2013/1/2/3'でルーティングした際にはcontrollerやactionがありませんでした。
これでは'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


2013/06/05 23:20 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<PHP5.4.7 PHPでフィボナッチ数F38を求める | HOME | PHP5.4.7 PHPでスレッド>>
忍者ブログ[PR]