Zend_Controller_Pluginを使う

導入

Zend_Controller_Pluginを使うことで認証などの共通の処理をスマートに書けます。
モジュール機構(MVCを塊ごとに分離するようなもの)と組み合わせると強力な共通処理をかけるでしょう。
導入はフロントコントローラーのregisterPluginから行います

<?php
//Zend_Controller_Plugin_Abstractを継承したクラスを作ります
class HogePlugin extends Zend_Controller_Plugin_Abstract{
}


//get front controller
$front = Zend_Controller_Front::getInstance();
//プラグインを登録
$front->registerPlugin(new HogePlugin());
//run zend framework
$front->dispatch();
?>

具体的な使い方

具体的にはプラグイン機構は、ZendFrameworkの行うルーティングやディスパッチ処理の前後に処理をフックさせる為のものです。
http://framework.zend.com/manual/ja/zend.controller.plugins.html

たとえば共通の認証処理を行う場合にはrouteShutdownメソッド内で、
認証処理を行いリクエスト情報を書き換えることでログイン情報を表示させます
(下記ソース1の箇所)
また、たとえばadminというモジュールにアドミン権限が必要なページをまとめてある場合、
モジュール名と組み合わせた認証によってアドミン認証も共通化することが可能です
(下記ソース2の箇所)

<?php
class HogePlugin extends Zend_Controller_Plugin_Abstract{
	/**
	 * @param	Zend_Controller_Request_Abstract
	 */
	public function routeShutdown(Zend_Controller_Request_Abstract $request){
		
		if( !isLogin() ){
			//1:ログインしていなかったらログインへ
			$request->setControllerName('login');
			$request->setActionName('index');
			$request->setModuleName('default');
			return $request;
		}
		
		if( $request->getModuleName() == 'admin' && !isAdmin() ){
			//2:アドミンモジュールで自分がアドミンでなかったらエラーへ
			$request->setControllerName('error');
			$request->setActionName('index');
			$request->setModuleName('default');
			return $request;
		}
		//正常なのでそのまま返却
		return $request;
	}
}
?>

リクエストを書き換えずにリダイレクトさせても良いでしょう。

こういったものの利点としては

  • 全てのページで正しい認証処理が入っているかのテストが必要なくなる
  • ある程度組みあがった後で全体で共通の処理をいれなければならない場合に簡単に対応できる
  • 可読性がます(しくみがわかっていれば・・・)

といった事があげられます。