前回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: