filter強化の解説
前回のbeforeFilterについて、質問いただいたので回答。
昨日のエントリに
何が良くなるのかわからんー。教えてくだせー。
という質問をいただいたので、続き書きまっせー。
とは言っても、私のアイディアではありません。
ごく一般的なアイディアですし、そもそも、Railsのパクリです。
まず、必ず呼び出されるbeforeFilterなんてもので、認証チェックとかやろうとすると、
何が良くなるのかわからんー。教えてくだせー。
という質問をいただいたので、続き書きまっせー。
とは言っても、私のアイディアではありません。
ごく一般的なアイディアですし、そもそも、Railsのパクリです。
まず、必ず呼び出されるbeforeFilterなんてもので、認証チェックとかやろうとすると、
class ShopController extends AppController{
function beforeFilter(){
//login check ..
if( ! $authed ){
$this->redirect(array("action"=>"login")); //login()へ。
}
}
function login(){ } //login()の前にbeforeFilter()
function item(){ }
function cart(){ }
}
function beforeFilter(){
//login check ..
if( ! $authed ){
$this->redirect(array("action"=>"login")); //login()へ。
}
}
function login(){ } //login()の前にbeforeFilter()
function item(){ }
function cart(){ }
}
↑永久ループに入る。
これは、CakePHPリーダーが詳しく解説されているとおりです。
このbeforeFilterの中に逃げ道を作ろうとすると、
function beforeFilter(){
if( $action != "login" && $action != "item" ){
//login check ..
if( ! $authed ){
$this->redirect(array("action"=>"login"));
}
}
}
if( $action != "login" && $action != "item" ){
//login check ..
if( ! $authed ){
$this->redirect(array("action"=>"login"));
}
}
}
という風に、
文字列比較やトリックコードで、汚れてしまいます。
そうなると、
→ このbeforeFilterの内部ロジックは、再利用できなくなる。
→ ここからコピペコピペが始まって
→ このフラグなんだっけ?
→ メンテできねぇ・・・
ということに陥りがち。
あとは、beforeFilterで、もっといろんなことがやりたくなります。例えば、データのアクセス権や存在のチェックなど。いちいち、アクションメソッドの先頭に同じコードを挟んでるようなら、フィルタを使いたい
(乱用は禁物ですが)。
なので、
class ShopController extends AppController{
//cartに行くときだけ、ログインチェック
//login以外では、データアクセス権チェック
var $beforeFilter
= array("checkAuth"=>
array("only"=>array("cart")),
"isAvailable"=>
array("except"=>array("login"))
);
function item(){ }
function cart(){ }
private function isExist(){ } //存在チェック
private function isAvailable(){ } //アクセス権チェック
}
class AppController extends Controller{
protected function checkAuth(){ }
function login(){ }
var function beforeFilter(){
//前回のコード
}
}
//cartに行くときだけ、ログインチェック
//login以外では、データアクセス権チェック
var $beforeFilter
= array("checkAuth"=>
array("only"=>array("cart")),
"isAvailable"=>
array("except"=>array("login"))
);
function item(){ }
function cart(){ }
private function isExist(){ } //存在チェック
private function isAvailable(){ } //アクセス権チェック
}
class AppController extends Controller{
protected function checkAuth(){ }
function login(){ }
var function beforeFilter(){
//前回のコード
}
}
とすると、自由にフィルタ組み合わせられるんじゃないですか?
というのが、前回の提案でした。
※○○さん、こんな感じでした。

