Zend Framework 1.12中Module的用法

來源:互聯網
上載者:User

預設的,如果使用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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.