CakePHPでの管理者機能の分け方いろいろ[CakePHP Advent Calendar 2011 Day6]

CakePHP Advent Calendar 2011の6日目です。
前回は@kachiokaさんでした。
CakePHPにおける複数形はCakePHP自体がどう判定するのかがInflectorクラス次第ですからね。
ちなみにcake.elはInflectorクラスをEmacs Lispインプリメントして利用しているので安心です。


さて、本題です。
システムを作っていると、一般ユーザ側と管理者側の機能に分かれることが多いですよね。
で、一般ユーザの機能と管理者側機能は「似ているけど異なる」という微妙な感じになるのもよくあることです。

ただ、微妙とはいえ一般ユーザと管理者とではできることが違うので、それぞれの機能を何かしらの形で明確に分ける必要があります。
周りをみているといろいろ方法があるのでちょっとまとめてみました。

分離したいものは「URL」だったり「機能」だったり「親クラス」だったりしますが、そこはあえて限定しないで考えてみます。

ちなみに諸事情によりCakePHP1.3系を対象とします。

1.action内で条件分岐で分ける

例えばモデルのUser.admin_flgなどを見て機能を分ける方法があります。
これは「機能」のみを分けることになります。
簡単ですが、機能の乖離がでてくると条件分岐がでてきて面倒だったりします。
個人的にはあまりお勧めしません。

2.Routing.prefixesを利用してactionごとに分ける

app/config/core.php

<?php
Routing.prefixes = array('admin');

と書けば、PostsController::admin_add()がadmin/posts/addにルーティングされるというCakePHPの機能ですね。
これは「URL」「機能」を分けることになります。
ソースのコメントに"admin"とあることから、ある程度管理機能などに使うことを想定しているのでしょうか。

3.AdminAppControllerクラスをつくって継承することで分ける

AdminAppControllerクラスをapp/app_controller.phpに記述したり、libsに入れてそれを呼びだして継承したりする手法ですね。
AppControllerを継承しているのか、AdminAppControllerを継承しているのかで渡すパラメータや共通処理などを変えたりします。
これは「機能」「親クラス」を分けることになります。

4.Controller prefix pluginを利用してコントローラごとに分ける

拙作のController prefix pluginを利用することで、
従来のaction名ではなくコントローラ名でルーティングができるようになります。
例えば、route.php

<?php
App::import('Lib', 'ControllerPrefix.ControllerPrefixRoute');
Router::connect('/admin/:controller/:action/*',
                array('controllerPrefix' => 'admin'), array('routeClass' => 'ControllerPrefixRoute'))

と設定することで、admin_posts_controller.phpのAdminPostsController::add()がadmin/posts/addにルーティングされます。
これは「URL」「機能」を分けることになります。3と併用すれば「親クラス」も分けることができますね。


5.プロジェクトフォルダ(appフォルダ)ごとに分ける

大規模なプロジェクトになると結構これが良かったりします。
App::build()を利用してComponentやPluginなどをまとめてしまう方法ですね。
これは「URL」「機能」を分けることになります。

まとめ

一般ユーザ側と管理者側の機能の分離方法について考えてみました。
どれが最適なのかは「そのシステムによりけり」なのでしょうけど、
いろいろ方法のアイデアを知っておくと後々便利だと思います。
他にもいろいろ方法があると思うので是非教えてください。


さて、明日は@msngさんです。お楽しみに。