作成日: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() { ~ 略 ~ }