FuelPHPで基底Controllerをつくる
Controllerの継承についての話。
以下のページに書かれているように、継承のためのベースコントローラを作成しましょってこと。
http://press.nekoget.com/fuelphp_doc/general/controllers/base.html
—————————-
ベースコントローラは、Controller_Public または Controller_Admin のような共有コントローラです。
各コントローラ間でロジックを共有するために使用します。
例えば、Controller_Admin コントローラは login/logout アクションを持つことができます。または dashboard も持ちます。
しかし、ユーザが管理者としてログインされているかどうかをチェックする before() メソッドを含むこともできます。
他のすべてのコントローラは管理者パネルでこれを継承し、自動的に安全になります。
A base controller is a shared controller, like Controller_Public or Controller_Admin and are used to share logic between groups of controllers.
For example, the Controller_Admin controller could contain your login/logout actions and maybe a dashboard, but it could also contain a before() method that checks to see if the user is logged in as an admin.
Then all other controllers in your admin panel will extend this and automatically be secured.
—————————-
なるほど。
ポイントは
・before()メソッドは、actionメソッドが呼び出しされよりも前に呼び出しされるメソッドである。
ってことだろう。
actionメソッドってのは、たとえばaction_list()とかのメソッドのことで、関数の前にaction_をつけると、ブラウザから直接実行されるメソッドになる。
で、上記のページが示していることとしては、
actionメソッドよりも先に呼び出しされるbeforeメソッドの特徴を活かして、共通処理を書きましょうねってこと。
例では、beforeメソッド内で、管理者でログインしているかチェックしている。
この考えで自分のつくろうとしているwebサービスを大きく分類すると、
A.ログインしなくても操作できるページ→publicと命名
B.ログインしていたら操作できるページ→userと命名
C.ログインした人が管理者権限の場合に操作できるページ→systemと命名
と、こんな感じか。
BとCは継承関係にできそうだけど、そこまではいいや、というかしないほうが良い予感。
今回は3つを独立した基底クラスにしよう。
その他のControllerと分けて管理しておきたいので、Controller/Baseのディレクトリ構成をとることにする(ディレクトリ名は全部小文字)。
Public | User | System | |
概要 | ページを訪問した人誰でも閲覧できるページ | 本webサービスにログインした人だけが閲覧できるページ | システム管理者だけが閲覧できるページ。メンテナンス用 |
beforeメソッド | なにもしない | ログインされていることをチェック | ログインされていることをチェックログインされている人がシステム管理者であることをチェック |
あ、simpleAuthを使ったユーザー認証ね。
public function before() { parent::before(); // ログインしていること if (!Auth::check()) { Response::redirect('sample1/login'); } }