fuelPHP コントローラー内の各アクションでの共通処理と一部だけ例外にしたい。

作成日:2018-03-27, 更新日:2018-03-27

fuelPHP コントローラー内の各アクションでの共通処理と一部だけ例外にしたい。

基本

コントローラー内の各アクションでの共通処理は「before()」内でゴニョゴニョする。

class Controller_Kushi extends 〇〇〇 {
  public function before() {
    if ( !\Auth::check() ) {
      // ログインしていない人
    }
    else {
      // ログインしている人
    }
    
    parent::before();
  }
  
  public function action_chicken() {
    ~ 略 ~

特定のアクションだけ除外したい

諸々の理由で一つだけ除外したいときがある。

例えば
・「/kushi/〇〇〇」は、ログインチェックをするようにしている。
・「/kushi」に「/wholezebra」をログインチェック無しで追加したい。
・・・こんなとき。

解決案1

コントローラーを別に用意する。

・「/kushi/〇〇〇」は、既存のまま
・「/kushi2/wholezebra」を別途、用意する。

→URLが「/kushi/」と「/kushi2/」で分かれるのが気に入らない。

解決案2

コントローラーを別に用意して、ルーティングで対応。

・「/kushi/〇〇〇」は、既存のまま「controller/kushi.php」を読み込ませる。
・「/kushi/wholezebra」は「controller/kushi2.php」を読み込ませる。

→似たようなファイルが2つあると、メンテのとき面倒になるから避けたい。
※ルーティングで分けたコトを忘れたりすると戸惑う。

解決案3

これが、本題。

「before()」内でアクション名で条件分岐させる(大文字を考慮して、小文字に変換してからチェック)

class Controller_Kushi extends 〇〇〇 {
  public function before() {
    if ( strtolower(\Request::active()->action) == 'wholezebra' ) {
      // 「kushi/wholezebra」にアクセスしようとしている人
    }
    else {
      if ( !\Auth::check() ) {
        // ログインしていない人
      }
      else {
        // ログインしている人
      }
    }
    
    parent::before();
  }
  
  public function action_chicken() {
    ~ 略 ~
  }
  
  public function action_pork() {
    ~ 略 ~
  }
  
  public function action_zebra() {
    ~ 略 ~
  }
  
  public function action_wholezebra() {
    ~ 略 ~
  }

関連項目

FuelPHPで自身の情報
FuelPHPの基本的なコントローラー