読者です 読者をやめる 読者になる 読者になる

忍び歩く男 - SLYWALKER

大阪のこっそりPHPer

CakePHP 1.2 Stableではてなのようなルーティング

CakePHP

今つくっているアプリケーションで、
はてなのような

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

てことで、いまのところどうやらこれで動いてくれるっぽい。
まだ、すべての確認はこれからです・・・(;^ω^)

こら!やっぱできねーよ!等々
つっこみ大歓迎です!!!