上次接觸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[] = ""
這裡我們看到,我們設定了default模組為預設模組。也就是說default模組裡面的controller和model的類名都不需要另外處理,而其它模組裡面的controller及model的類名都需要加模組首碼哦,這裡後面會詳細講到。
然後我們去修改application/Bootstrap.php檔案為以下內容。
<?phpclass Bootstrap extends Zend_Application_Bootstrap_Bootstrap{protected function _initAppAutoload() {$autoloader = new Zend_Application_Module_Autoloader(array('namespace' => 'App','basePath' => dirname(__FILE__),));return $autoloader;}}
到這裡還沒有結束,我們需要去修改對應的模組裡面的Bootstrap.php檔案的內容。
先修改application/modules/default/Bootstrap.php,修改為以下內容:
<?phpclass 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; } }
然後再修改為 application/modules/admin/Bootstrap.php,修改為以下內容:
<?phpclass 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; } }
以上的修改要注意兩點,第一,注意類名需要加模組首碼,第二,注意模組裡面的檔案名稱繼承的是Zend_Application_Module_Bootstrap而不是Zend_Application_Bootstrap_Bootstrap。如果繼承檔案錯誤的話,會報錯:Maximum function nesting level of '100' reached, aborting!
我們再進行最後一步,就可以進行多模組的訪問了。因為default是預設模組,所以我們不需要去修改,我們要去修改的是admin模組裡面的內容。
開啟admin模組裡面的IndexController.php檔案,修改類名為:
class Admin_IndexController extends Zend_Controller_Action{}
此時我們可以測試一下,我們訪問http://localhost/project/public則訪問的是default模組的首頁,當訪問http://localhost/project/public/admin時訪問的是後台首頁。
我們說完了多模組配置的contoller訪問之後,再來提一下model的訪問。
首先我們去修改設定檔,application.ini。在production中添加如下內容。
db.adapter = PDO_MYSQLdb.params.host = localhostdb.params.dbname = voice_smsdb.params.username = rootdb.params.password = 123456db.params.charset = UTF8
然後我們去串連資料庫,在application/Bootstrap.php裡面添加這個方法
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;}
先說default模組。
在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' );}}
我們在在application/default/controller/IndexController.php中用以下語句則可執行個體化此model
$smsInformationModel = new Model_SmsInformation();
然後說admin模組。
在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/"
對應的模組會去找到對應的layout。
到這裡就一切OK了。