Filterの適用について

2006/02/08 | mojavi2

フィルターの雛形に続き、フィルター適用順序(というかmojaviの挙動)に関する比較的わかりやすい説明が先ほど同様の2chフレームワークスレにあった(以下引用)。


個々のフィルタには前処理・後処理という2段階の実行順序があって、登録した順に前処理が全て実行されてから、今度は逆順に後処理が実行される。

Actionの実行部分もフィルタの一種として扱われていて(ExecutionFilter)、全てのフィルタの登録後に登録されている。
Viewの実行(View::execute())はExecutionFilterの中で実行されている。

結果、登録順に1,2…の番号を付けた時に、
1. GlobalFilterのpre-filter1,pre-filter2…を実行
2. moduleFilterのpre-filter1,pre-filter2…を実行
3. ExecutionFilterを実行(認証や特権の判定、action処理)
4. Viewの実行
5. moduleFilterの…post-filter2,post-filter1を実行
6. GlobalFilterの…post-filter2,post-filter1を実行
という順番で処理されることになる。

mojaviのソースを読めばわかることだけど、この程度の情報がドキュメントとしてしっかり用意されているとうれしいんだけれど・・・。

Filter雛形

2006/02/08 | mojavi2

Filterの例が少なく困っていたけれど、最近はgoogleの検索で日本語サイトがぽつぽつと引っかかってくるようになった。以下はFilterクラスの雛形。引用元は2chのフレームワークスレ

<filter>.class.php
class <filter名> extends Filter{
 function execute(&$filterChain,&$controller,&$request,&$user){
  static $loaded;
  // ActionChainやAction::forwardを使った時にフィルタが複数回適用されるのを防ぐ
  if($loaded == NULL){
   $loaded = TRUE;
   //前処理フィルタ
   …
   //filter chain の次のフィルタを実行
   //pre-filterとpost-filterの分岐点
   $filterChain->execute($controller,$request,$user);
   //後処理フィルタ
   …
  }else{
   $filterChain->execute($controller,$request,$user);
  }
 }
}

作成したフィルタの導入例

2006/01/23 | mojavi2

作成したフィルタはGlobalFilterList.class.phpで、以下のように指定すると全てのモジュールに対して適用されます。

 $this->filters[‘MappingRequestVarsFilter’] =& new MappingRequestVarsFilter;
 $this->filters[‘OptimizeRequestVarsFilter’] =& new OptimizeRequestVarsFilter;

入力データのトリミングをフィルタで

2006/01/23 | mojavi2

入力データのトリミングを一括処理するフィルタの例。

 class OptimizeRequestVarsFilter extends Filter
 {
  function execute (&$filterChain, &$controller, &$request, &$user)
  {
   static $loaded;
   if($loaded===NULL){
    $loaded=true;
    $params=$request->getParameters();
    foreach($params as $tmpKey => $tmpValue){
     if(is_array($request->getParameter($tmpKey))){
      //
     }else{
      $request->setParameter($tmpKey,trim($tmpValue));
     }
    }
    $filterChain->execute($controller,$request,$user);
   }else{
    $filterChain->execute($controller,$request,$user);
   }
  }
 }

これを登録して使用しています。簡単だけど結構便利。

mojavi+HTML_QuickFormで使うべきフィルタ

2006/01/23 | mojavi2

久保敦啓さんがインプレスのPHPムック本「まるごとPHP」に書かれていたフィルタです。
mojaviではユーザからの入力を$requestで一元管理しているけれど、HTML_QuickFormでは$_POST、$_GETで管理しているため、以下のフィルタを使うとよいとのこと。

 class MappingRequestVarsFilter extends Filter
 {
  function execute(&$filterChain, &$controller, &$request, &$user)
  {
   static $loaded;
   if ($loaded === null) {
    $loaded = true;
    if ($_SERVER[‘REQUEST_METHOD’] === ‘GET’) {
     $_GET = array();
     $_GET = &$request->getParameters();
    } else {
     $_POST = array();
     $_POST = &$request->getParameters();
    }
    $filterChain->execute($controller, $request, $user);
   } else {
    $filterChain->execute($controller, $request, $user);
   }
  }
 }

参照元はこちら


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net