ZendFramework1.12中Module的用法
預設的,如果使用Zend studio的嚮導工具,生成的MVC目錄結構如下:
上面的那種目錄結構,所有的controller,model和view檔案都放在同一個目錄下,如果專案很大的話,就不利於管理,為了便於管理,Zend Framework引入modules的概念,這樣可以將controllers,models,views放入同一個Module。Module實際上是一個把MVC檔案放在一起的一個資料夾而已。象上面的目錄結構,沒有用的Module。如果要使用Module,ZendFramework中通常有2種不同的目錄結構(事實上也不一定必須採用這2種,可以自定義,但是通常都會採用下面的一種),如下圖:
先看第一種,第一種就是在application目錄下建2個不同的資料夾,一個是default,這個是ZF預設的module,另一個是Mymodule。建好後,還需要讓ZF框架知道由於使用了Module導致controller的位置已經改變了。有2種方法,一種是寫在application.ini配置檔案中,還有一種是用程式碼實現。2種方法是等價的。
①如果寫配置檔案,只需要如下:
把原先的預設的controller配置註釋掉(用分號註釋)或者去掉,再加入新的路徑。
;resources.frontController.controllerDirectory = APPLICATION_PATH “/controllers”
resources.frontController.controllerDirectory.default = APPLICATION_PATH “/default/controllers”
resources.frontController.controllerDirectory.Mymodule = APPLICATION_PATH “/Mymodule/controllers”
配置好後,通過index.php中下面的語句,會讀到有關的配置的。
// Create application, bootstrap, and run
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . `/configs/application.ini`
);
②如果不採用修改配置檔案的方法,那麼直接在index.php資料夾加入如下程式碼:
1
2
3
4
|
Zend_Controller_Front::getInstance()->setControllerDirectory( array (
`default` => APPLICATION_PATH. `/default/controllers` ,
`Mymodule` => APPLICATION_PATH. `/Mymodule/controllers`
)); |
建議加在$application = new Zend_Application這句語句後面,如果寫在這句話前面,還需要寫如下程式碼去載入`Zend_Controller_Front`這個類庫:
include_once “Zend/Loader.php”;
Zend_Loader::loadClass(`Zend_Controller_Front`);
事實上,也可以使用addControllerDirectory方法。
其中Zend_Controller_Front::getInstance()獲得了一個Zend_Controller_Front物件,該物件在ZF中被設計為一個單例模式,只需要獲取就行了,不需要建立例項。這個類完成例項化物件、觸發事件、建立預設的行為等,它的主要目的是處理所有進入應用的請求。
在2個IndexAction中對應的輸入下面的程式碼,在Mymodule下的Action中的程式碼:
1
2
3
4
5
|
public function indexAction()
{ var_dump(Zend_Controller_Front::getInstance()->getrequest());
echo "Hello from Mymodule indexAction" ;
} |
在default下的Action中的程式碼:
1
2
3
4
5
|
public function indexAction()
{
var_dump(Zend_Controller_Front::getInstance()->getrequest());
echo "Hello from default indexAction" ;
}
|
順便把它們各自的view也改了,分別為:
1
|
< p >This default module Index.phtml</ p >
|
和
1
|
< p >This Mymodule module Index.phtml</ p >
|
接下來看看執行效果,輸入http://localhost:8002/default/ ,瀏覽器介面如下:
發現之前讀到的Zend_Controller_Request_Http物件中的引數欄位中,可以清楚的看到,我們已經獲得了MVC的三個值了。
事實上,對於http://localhost:8002/這樣的不輸入default,系統也會預設的認為module是default,可以自行測試。
接著,輸入url:http://localhost:8002/Mymodule/ (相關伺服器配置要搞定),這時候會發現頁面報錯。
這是怎麼回事?肯定哪裡出錯了。原來使用Module後,ZF有個約定,就是必須把Module對應的Controller的類名(不是檔名)比較加上字首,字首的格式為Module名+下劃線_。而對於名稱為default的Module,則不需要加字首。在配置檔案中,之前設定的Module名就是MyModule,
因此把Mymodule資料夾中的IndexController.php中的類名改成Mymodule_IndexController。如果該Module名設成aaa,那麼就改成aaa_IndexController
。通常為了便於管理,Module名和資料夾名都是一致的。再次執行http://localhost:8002/Mymodule/。
終於成功了。注意URL中的module路徑的大小寫和配置中的大小寫要一致。
對於第二種目錄結構,同樣有兩種方式讓ZF框架知道我們已經採用了module,和之前的方法一樣,寫配置檔案和寫程式碼:
①如果寫配置檔案,和第一種其實是一樣的,把原先預設的配置檔案註釋掉或者去掉。把路徑設定對。
;resources.frontController.controllerDirectory = APPLICATION_PATH “/controllers”
resources.frontController.controllerDirectory.default =APPLICATION_PATH”/HereIsModules/default/controllers”
resources.frontController.controllerDirectory.Mymodule =APPLICATION_PATH”/HereIsModules/Mymodule/controllers”
②如果不採用修改配置檔案的方法,那麼也是和第一種一樣,直接在index.php資料夾加入如下程式碼:
1
2
3
4
|
Zend_Controller_Front::getInstance()->setControllerDirectory( array (
`default` => APPLICATION_PATH. `/HereIsModules/default/controllers` ,
`Mymodule` => APPLICATION_PATH. `/HereIsModules/Mymodule/controllers`
)); |
其後的操作和之前的操作一樣。
事實上,無論採用哪種Module的目錄方式,只要配置對了路徑,都是等價的。而如果不採用Module,系統也會自己為module引數加上`default`。
由於ZF的預設路由結構就是:module/:controller/:action/*和:controller/:action/*,因此在不採用module的檔案結構下,輸入url:http://localhost:8003/default和http://localhost:8003/是等價的,ZF會自動匹配路由結構,獲取到對應的:module/:controller/:action/的值。
本文轉自cnn23711151CTO部落格,原文連結:http://blog.51cto.com/cnn237111/1290458 ,如需轉載請自行聯絡原作者
相關文章
- [Vuex系列] - Module的用法(終篇)Vue
- js中的this用法JS
- SQL 中With as 的用法SQL
- Oracle中with的用法Oracle
- 解決IDEA中maven中的module是灰色的IdeaMaven
- 淺談Node中module的實現原理
- MYSQL中replace into的用法MySql
- Java中super的用法Java
- mySQL中replace的用法MySql
- iOS 中 cell的用法iOS
- golang中channel的用法Golang
- 【 Oracle中rownum的用法 】Oracle
- Java中DecimalFormat的用法JavaDecimalORM
- MySQL中limit的用法MySqlMIT
- js中的||與&&用法JS
- c++中::的用法C++
- mysql中count的用法MySql
- java中filter的用法JavaFilter
- java中switch的用法Java
- Oracle 中 case的用法Oracle
- java中Scanner的用法。Java
- JAVA中...的特殊用法。Java
- JavaScript中的setInterval用法JavaScript
- JavaScript中document的用法JavaScript
- python中from module import * 的一個陷阱PythonImport
- TypeScript 裡的 module 解析過程 - Module ResolutionTypeScript
- python中return的用法Python
- oracle樹中prior的用法Oracle
- python中的eval用法Python
- SQL中的遞迴用法SQL遞迴
- SQL中Merge的用法SQL
- PHP中引號的用法PHP
- C++中& 的基本用法C++
- JAVA中subString的用法Java
- SQL Server中@@ROWCOUNT的用法SQLServer
- Scala中apply的用法APP
- php中的continue用法PHP
- Oracle中rowid的用法Oracle