預設的,如果使用Zend studio的嚮導工具,產生的MVC目錄結構如下:
650) this.width=650;" style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;border-top:0px;border-right:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="%7D2CEO6YX6%7BRJVV)5%7BREAPNS" border="0" alt="%7D2CEO6YX6%7BRJVV)5%7BREAPNS" src="http://www.bkjia.com/uploads/allimg/131228/111S625C-0.jpg" height="505" />
上面的那種目錄結構,所有的controller,model和view檔案都放在同一個目錄下,如果項目很大的話,就不利於管理,為了便於管理,Zend Framework引入modules的概念,這樣可以將controllers,models,views放入同一個Module。Module實際上是一個把MVC檔案放在一起的一個檔案夾而已。象上面的目錄結構,沒有用的Module。如果要使用Module,ZendFramework中通常有2種不同的目錄結構事實上也不一定必須採用這2種,可以自訂,但是通常都會採用下面的一種),如:
650) this.width=650;" style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;border-top:0px;border-right:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="AWPVZE)WHL)%7BLS3_]VG1HI1" border="0" alt="AWPVZE)WHL)%7BLS3_]VG1HI1" src="http://www.bkjia.com/uploads/allimg/131228/111SA0C-1.jpg" height="392" />650) this.width=650;" style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;border-top:0px;border-right:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="229Y%60OISJ8WSN9WISB9R1[C" border="0" alt="229Y%60OISJ8WSN9WISB9R1[C" src="http://www.bkjia.com/uploads/allimg/131228/111S63529-2.jpg" height="398" />
先看第一種,第一種就是在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檔案夾加入如下代碼:
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中的代碼:
public function indexAction(){ var_dump(Zend_Controller_Front::getInstance()->getrequest()); echo "Hello from Mymodule indexAction";}
在default下的Action中的代碼:
public function indexAction() { var_dump(Zend_Controller_Front::getInstance()->getrequest());echo "Hello from default indexAction"; }
順便把它們各自的view也改了,分別為:
<p>This default module Index.phtml</p>
和
<p>This Mymodule module Index.phtml</p>
接下來看看運行效果,輸入http://localhost:8002/default/ ,瀏覽器介面如下:
650) this.width=650;" style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;border-top:0px;border-right:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="2_O26(1)D%7D(ONJRPHDO@[1C" border="0" alt="2_O26(1)D%7D(ONJRPHDO@[1C" src="http://www.bkjia.com/uploads/allimg/131228/111SB016-3.jpg" height="453" />
發現之前讀到的Zend_Controller_Request_Http對象中的參數欄位中,可以清楚的看到,我們已經獲得了MVC的三個值了。
事實上,對於http://localhost:8002/這樣的不輸入default,系統也會預設的認為module是default,可以自行測試。
接著,輸入url:http://localhost:8002/Mymodule/ 相關伺服器配置要搞定),這時候會發現頁面報錯。
650) this.width=650;" style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;border-top:0px;border-right:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="I{}SHSXI1DP8)@YD%Z4TXRW" border="0" alt="I{}SHSXI1DP8)@YD%Z4TXRW" src="http://www.bkjia.com/uploads/allimg/131228/111S61A9-4.jpg" height="120" />
這是怎麼回事?肯定哪裡出錯了。原來使用Module後,ZF有個約定,就是必須把Module對應的Controller的類名不是檔案名稱)比較加上首碼,首碼的格式為Module名+底線_。而對於名稱為default的Module,則不需要加首碼。在設定檔中,之前設定的Module名就是MyModule,650) this.width=650;" style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;border-top:0px;border-right:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="_JM@XVZN]UU2BV@(2$I)FL0" border="0" alt="_JM@XVZN]UU2BV@(2$I)FL0" src="http://www.bkjia.com/uploads/allimg/131228/111S62Z3-5.jpg" height="72" />
因此把Mymodule檔案夾中的IndexController.php中的類名改成Mymodule_IndexController。如果該Module名設成aaa,那麼就改成aaa_IndexController
。通常為了便於管理,Module名和檔案夾名都是一致的。再次運行http://localhost:8002/Mymodule/。
650) this.width=650;" style="background-image:none;border-bottom:0px;border-left:0px;border-top:0px;border-right:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="Z)CSL6N2%%33}~``Z@_R@YH" border="0" alt="Z)CSL6N2%%33}~``Z@_R@YH" src="http://www.bkjia.com/uploads/allimg/131228/111S63235-6.jpg" height="447" />
終於成功了。注意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檔案夾加入如下代碼:
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/的值。
本文出自 “一隻部落格” 部落格,請務必保留此出處http://cnn237111.blog.51cto.com/2359144/1290458