原文出處:http://blog.csdn.net/a82168506/article/details/10228011
上次接觸zend framework已經很久遠了,10年的事情了。最近在做一個項目,時間不緊,就又把ZF拿出來折騰。而我發現以前做ZF的記憶已經在我腦中如夢幻泡影,消失無蹤,爲了配置多模塊還又去查了資料,爲了避免此種情況再次發生,做個記錄吧。
首先,我們要新建一個ZF項目,目錄結構如下。
我們想要配置多模塊呢,首先要在,application下面建一個modules文件夾,然後創建模塊文件夾,這裏我以default和admin舉例。default爲前臺,admin爲後臺,符合最基礎的網站所需了。在modules下面新建default以及admin文件夾,然後分別把controllers,models以及views剪切到這兩個文件夾內。此時,文件目錄如下所示。並且將Bootstrap.php文件分別複製到兩個目錄裏。
首先,我們去修改application.ini文件。刪除以下這行。
- resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
- resources.frontController.controllerDirectory.default =APPLICATION_PATH "/modules/default/controllers"
- resources.frontController.controllerDirectory.admin =APPLICATION_PATH "/modules/admin/controllers"
- resources.FrontController.moduleDirectory =APPLICATION_PATH "/modules"
- resources.FrontController.moduleControllerDirectoryName ="controllers"
- resources.FrontController.defaultModule= "default"
- resources.modules[] = ""
然後我們去修改application/Bootstrap.php文件爲以下內容。
- <?php
- class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
- {
- protected function _initAppAutoload() {
- $autoloader = new Zend_Application_Module_Autoloader(array(
- 'namespace' => 'App',
- 'basePath' => dirname(__FILE__),
- ));
- return $autoloader;
- }
- }
先修改application/modules/default/Bootstrap.php,修改爲以下內容:
- <?php
- class Default_Bootstrap extends Zend_Application_Module_Bootstrap {
- protected function _initAutoload() {
- $autoloader = new Zend_Application_Module_Autoloader(array(
- 'namespace' => '',
- 'basePath' => APPLICATION_PATH . '/modules/default'));
- return $autoloader;
- }
- }
- <?php
- class Admin_Bootstrap extends Zend_Application_Module_Bootstrap {
- protected function _initAutoload() {
- $autoloader = new Zend_Application_Module_Autoloader(array(
- 'namespace' => '',
- 'basePath' => APPLICATION_PATH . '/modules/admin'));
- return $autoloader;
- }
- }
我們再進行最後一步,就可以進行多模塊的訪問了。因爲default是默認模塊,所以我們不需要去修改,我們要去修改的是admin模塊裏面的內容。
打開admin模塊裏面的IndexController.php文件,修改類名爲:
- class Admin_IndexController extends Zend_Controller_Action
- {
- }
我們說完了多模塊配置的contoller訪問之後,再來提一下model的訪問。
首先我們去修改配置文件,application.ini。在production中添加如下內容。
- db.adapter = PDO_MYSQL
- db.params.host = localhost
- db.params.dbname = voice_sms
- db.params.username = root
- db.params.password = 123456
- db.params.charset = UTF8
- protected function _initDatabase() {
- $options = $this->getApplication()->getOptions();
- $db = Zend_Db::factory( $options[ 'db' ][ 'adapter' ], $options[ 'db' ][ 'params' ] );
- Zend_Db_Table_Abstract::setDefaultAdapter( $db );
- Zend_Registry::set( 'DB', $db );
- return $db;
- }
在application/default/models裏面添加一個model文件,SmsInformation.php,此文件的內容爲:
- class Model_SmsInformation
- {
- private $_tableName;
- private $_connect;
- /**
- * construct function
- */
- public function __construct() {
- $this->_tableName = 'smsinformation';
- $this->_connect= Zend_Registry::get( 'DB' );
- }
- }
- $smsInformationModel = new Model_SmsInformation();
在application/admin/models裏面添加一個model文件,SmsInformation.php,此文件的內容爲:
- class Admin_Model_SmsInformation
- {
- private $_tableName;
- private $_connect;
- /**
- * construct function
- */
- public function __construct() {
- $this->_tableName = 'smsinformation';
- $this->_connect= Zend_Registry::get( 'DB' );
- }
- }
我們在在application/admin/controller/IndexController.php中用以下語句則可實例化此model
- $smsInformationModel = new Admin_Model_SmsInformation();
最後還有layout配置,在兩個模塊下面分別新建layouts/scripts文件夾,裏面放入默認佈局文件layout.phtml。
目錄結構如下:
layout.phtml的文件內容爲:
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <?php $baseUrl = $this->baseUrl();?>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <?php
- echo $this->headTitle();
- $this->headLink()->appendStylesheet($baseUrl . "/css/admin.css");
- echo $this->headLink();
- $this->headScript()->appendFile($baseUrl . "/js/jquery-2.0.2.min.js");
- echo $this->headScript();
- ?>
- </head>
- <body>
- <div class="container">
- <?php echo $this->layout()->content; ?>
- </div>
- </body>
- </html>
將application.ini中加入兩句話:
- default.resources.layout.layoutPath = APPLICATION_PATH "/modules/default/layouts/scripts/"
- admin.resources.layout.layoutPath = APPLICATION_PATH "/modules/admin/layouts/scripts/"
然後去修改application/Bootstrap.php文件。
在Bootstrap類中添加一個方法
- /**
- * about multi-layout configuration
- */
- protected function _initLayoutHelper()
- {
- $this->bootstrap('frontController');
- $layout= Zend_Controller_Action_HelperBroker::addHelper(
- new Rockux_Controller_Action_Helper_LayoutLoader());
- }
在此文件中再添加一個類
- /**
- * Layout
- *
- * @package Applicaiton
- * @author Qiao Chen <[email protected]>
- * @version $$Id: Bootstrap.php 2013-9-22
- */
- class Rockux_Controller_Action_Helper_LayoutLoader extends Zend_Controller_Action_Helper_Abstract
- {
- public function preDispatch(){
- $bootstrap=$this->getActionController()->getInvokeArg('bootstrap');
- $config=$bootstrap->getOptions();
- $module=$this->getRequest()->getModuleName();
- if(isset($config[$module]['resources']['layout']['layoutPath'])){
- $layoutPath=$config[$module]['resources']['layout']['layoutPath'];
- $this->getActionController()->getHelper('layout')->setLayoutPath($layoutPath);
- }
- }
- }
對應的模塊會去找到對應的layout。
再說幾個layout的常見用法。
如果不使用layout,可用以下語句。
- $this->_helper->layout()->disableLayout();
- $this->_helper->layout()->setLayout("loginlayout");
到這裏就一切OK了。