プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
CakePHP1.3系、特定のコントローラで共通前処理を行う
あるcontrollerでのみ特定の前処理を行いたいってなケースがありましてね。
要は「admin_hoges」みたいなcontrollerで
このコントローラには管理者のみアクセス可能にしたかったのです。
でも「admin_hoges」の全部のアクションメソッドに

  if($admin_flg == false){
      //アクセス権限エラー時の処理
  }


みたいに書くのはイヤだなーってのが経緯。

ほんであれやこれやと調べてみたのですが、
結論としてはコールバック関数と言うのを使えば良いらしいです。

ん?コールバック関数って何(--?

と一瞬難しく考えたくなりますが、
要は「決まった名前で関数作れば特定のタイミングで動くよ」ってこと。

今回のケースで言えば「beforeFilter()」って関数名で

■app/controllers/admin_hoges_controller.php
  public function beforeFilter(){
      if($admin_flg == false){
          //アクセス権限エラー時の処理
      }
  }


とか書けば「admin_hoges_controller.php」の全部のアクション、
add()だろうとedit()だろうと呼び出されるとまず最初に
「beforeFilter()」内の処理が実行されるのだそーです。

おー、これで解決\(--)/


と思うのはまだ早くてですね(--ゞ

継承元でもbeforeFilter()を定義している場合は
その継承元のbeforeFilter()を上書きしちゃうので注意が必要。

つまり

    class AdminHogesController extends AppController {
        public function beforeFilter() {
              //AdminHoges共通前処理
        }
    }


のようにAdminHogesControllerがAppControllerを継承していて

  class AppController extends Controller {
      public function beforeFilter() {
          //AppController共通前処理
      }

  }

ってな感じでAppControllerでもbeforeFilter()が定義されている場合、
AppControllerのbeforeFilter()が実行されません。
※AdminHogesControllerのbeforeFilter()が上書きしてるので。

これはちょっと困ったことになる場合が多くてですね。
例えば継承元(AppController)でログインチェックなんかを行っている場合、
その処理がスキップされちゃうことになります。
また動作上問題が出ない場合でも、本来の共通処理が定義されているのに
勝手に道から外れちゃうのは設計上好ましくないと思うのです。

と言う訳で

■app/controllers/admin_hoges_controller.php
  public function beforeFilter(){
      //継承元の「beforeFilter()」呼出し
      parent::beforeFilter();


      //自身の「beforeFilter()」定義
      if($admin_flg == false){
          //アクセス権限エラー時の処理
      }
  }


のように「parent::beforeFilter();」ってな記述、
継承元の「beforeFilter()」呼出もセットで
覚えておいた方が良いと思います。

個人的には、個別のコントローラで「beforeFilter()」を定義する場合は
「parent::beforeFilter();」記述までがワンセット、
「parent::beforeFilter();」を記述しない方が例外と考えた方が
設計上の問題は少ない気がします。

まぁ余計なお世話ですね、すんません。

スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:CakePHP1.3系  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事