前回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
今後コントローラが増えても、同様にBaseControllerを継承すればZend_View_Smartyが使用できるようになります。
他にもDB接続や定義ファイルの読み込みなど、共通して使うものはここに書くとよいでしょう。
つうかこのくらい最初から用意してほしい気がするんだが。
ちなみにこれもコントローラなんでhttp://zend.localhost/base/index/とか入れられると直接呼ばれてしまいます。
もしかしたらcontrollersフォルダ外に出すとかした方がいいかもしれません。
もっとコントローラで処理する方法はないでしょうか。
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
トラックバック
トラックバックURL: