忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/04/26 19:22 |
ZF1.11:Zend_ControllerでSmartyその2
前回Zend_ControllerでSmartyを使えるようにしましたが、フロントにごりごりコードを詰め込んでいて見た目がいまいちです。
もっとコントローラで処理する方法はないでしょうか。

Zend_Controller_ActionにはURLから呼び出されるアクション以外にも、必ず呼ばれるメソッドが幾つか用意されています。
Zend_Controller_Action::init()、preDispatch()、postDispatch()のみっつで、init()はコンストラクタで、preDispatch()はアクションの実行前、postDispatch()は実行後に呼ばれます。
そこで毎回使用するデータベース接続などはinit()に書くと便利、ということになります。

ところが普通にIndexController::init()に実装すると、別のコントローラHogeControllerを呼び出した場合は実行されない、という事態になってしまいます。
各コントローラのinit()はあくまでコントローラ単位の共通要素となります。

では全コントローラで共通して行える処理はないのかというと、デフォルトではありません。
Zend_Controller_Actionと各コントローラの間にひとつ基底クラスを噛ますことになります。

html/index.php
<?php
	define('APP_DIR', dirname(__FILE__).'/../application/');
	require_once('Zend/Controller/Front.php');
	Zend_Controller_Front::run(APP_DIR.'controllers');
application/controllers/BaseController.php
<?php
	//require
	require_once('Zend/Controller/Front.php');
	require_once('Zend/View/Smarty.php');
	require_once(APP_DIR.'smarty/libs/Smarty.class.php');
	
	class BaseController extends Zend_Controller_Action{
	    public function init(){
			define('SMARTY_DIR', APP_DIR.'smarty/libs/');
			define('SMARTY_TEMPLATE_DIR', APP_DIR.'templates/');
			define('SMARTY_COMPLIE_DIR', APP_DIR.'smarty/templates_c/');
			define('SMARTY_CACHE_DIR', APP_DIR.'smarty/cache/');
			define('SMARTY_CONFIG_DIR', APP_DIR.'smarty/config/');
	        $this->view   = new Zend_View_Smarty(SMARTY_TEMPLATE_DIR, array(
				  'compile_dir'=>SMARTY_COMPLIE_DIR
				, 'cache_dir'=>SMARTY_CACHE_DIR
				, 'config_dir'=>SMARTY_CONFIG_DIR
			));
	        $viewRenderer = $this->_helper->getHelper('viewRenderer');
	        $viewRenderer->setView($this->view)
	                     ->setViewBasePathSpec(SMARTY_TEMPLATE_DIR)
	                     ->setViewScriptPathSpec(':controller/:action.:suffix')
	                     ->setViewScriptPathNoControllerSpec(':action.:suffix')
	                     ->setViewSuffix('html');
		    }
	}
application/controllers/IndexController.php
<?php
	require_once(APP_DIR.'controllers/BaseController.php');
	class IndexController extends BaseController{
	    public function indexAction(){}
	    public function hogeAction(){}
	}
IndexControllerでは、Zend_Controller_ActionではなくBaseControllerをextendsするように変更しました。
今後コントローラが増えても、同様にBaseControllerを継承すればZend_View_Smartyが使用できるようになります。
他にもDB接続や定義ファイルの読み込みなど、共通して使うものはここに書くとよいでしょう。
つうかこのくらい最初から用意してほしい気がするんだが。

ちなみにこれもコントローラなんでhttp://zend.localhost/base/index/とか入れられると直接呼ばれてしまいます。
もしかしたらcontrollersフォルダ外に出すとかした方がいいかもしれません。
PR


2011/11/28 23:14 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<Minecraft 1.8.1 IndustrialCraft2 掘削機を作る | HOME | 買ったものリスト 2011/11/27>>
忍者ブログ[PR]