CakePHP 1.2 Stableではてなのようなルーティング
今つくっているアプリケーションで、
はてなのような
http://d.hatena.ne.jp/username/~
↑こんなルーティングが必要になった。
だれか同じことを思ってやってないかと、
Google先生に尋ねるもつれない答え・・・
ずっぽりハマってしまったが、できたっぽいのでまとめておきます。
adminルーティングはそのまま使いたいので、
usernameには「admin~」といったようなものは、
validateではじいとく。
いちいちコントローラ書くがめんどくさいので、
ど〜んと設定しちゃってます。
ここらへんは、クックブックのぱくり
ACO の作成を自動化するツール :: ACL を制御するシンプルなアプリケーション :: 開発例 :: マニュアル :: 1.2 Collection :: The Cookbook
app/config/routes.php
<?php $controllers = Configure::listObjects('controller'); $appIndex = array_search('App', $controllers); if ($appIndex !== false ) { unset($controllers[$appIndex]); } foreach ($controllers as $controller) { $controller = Inflector::underscore($controller); Router::connect( '/:username/'.$controller.'/:action/*', array('controller' => $controller, 'action' => 'index'), array('username'=>'(?!admin).*') ); } Router::connect( '/:username', array( 'controller' => 'pages', 'action' => 'display', 'home', ), array('username'=>'(?!admin).*') ); ?>
これだけだと、redirectやFormHelperでえらいめに会うので、
ちょこちょこっと修正する。
(ちょこちょこっと言いながら、やり方がわかるまで実は膨大な時間がかかっている)
まずは、AppControllerでredirect()をオーバーライドする。
app/app_controller.php
<?php class AppController extends Controller { function redirect($url, $status = null, $exit = true) { if (is_array($url) && !empty($this->params['username'])) { $url = array_merge($url, array('username'=>$this->params['username'])); } parent::redirect($url, $status, $exit); } } ?>
次は、AppHelperでurl()をオーバーライド
これで、ヘルパー関連でのurlはOK(っぽい)
app/app_helper.php
<?php App::import('Core', 'Helper'); class AppHelper extends Helper { function url($url = null, $full = false) { if (is_array($url) && !empty($this->params['username'])) { $url = array_merge($url, array('username'=>$this->params['username'])); } return Router::url($url, array('full' => $full, 'escape' => true)); } } ?>
urlの指定は、配列で行うこと!
usernameを意識することなく今まで通りでOK!
すげ〜CakePHP!
てことで、いまのところどうやらこれで動いてくれるっぽい。
まだ、すべての確認はこれからです・・・(;^ω^)
こら!やっぱできねーよ!等々
つっこみ大歓迎です!!!