ZendFramework1.12中Module的用法

技術小甜發表於2017-11-15

預設的,如果使用Zend studio的嚮導工具,生成的MVC目錄結構如下:

%7D2CEO6YX6%7BRJVV)5%7BREAPNS

上面的那種目錄結構,所有的controller,model和view檔案都放在同一個目錄下,如果專案很大的話,就不利於管理,為了便於管理,Zend Framework引入modules的概念,這樣可以將controllers,models,views放入同一個Module。Module實際上是一個把MVC檔案放在一起的一個資料夾而已。象上面的目錄結構,沒有用的Module。如果要使用Module,ZendFramework中通常有2種不同的目錄結構(事實上也不一定必須採用這2種,可以自定義,但是通常都會採用下面的一種),如下圖:

AWPVZE)WHL)%7BLS3_]VG1HI1229Y%60OISJ8WSN9WISB9R1[C



先看第一種,第一種就是在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/ ,瀏覽器介面如下:

2_O26(1)D%7D(ONJRPHDO@[1C

發現之前讀到的Zend_Controller_Request_Http物件中的引數欄位中,可以清楚的看到,我們已經獲得了MVC的三個值了。

事實上,對於http://localhost:8002/這樣的不輸入default,系統也會預設的認為module是default,可以自行測試。



接著,輸入url:http://localhost:8002/Mymodule/ (相關伺服器配置要搞定),這時候會發現頁面報錯。

I{}SHSXI1DP8)@YD%Z4TXRW

這是怎麼回事?肯定哪裡出錯了。原來使用Module後,ZF有個約定,就是必須把Module對應的Controller的類名(不是檔名)比較加上字首,字首的格式為Module名+下劃線_。而對於名稱為default的Module,則不需要加字首。在配置檔案中,之前設定的Module名就是MyModule,_JM@XVZN]UU2BV@(2$I)FL0

因此把Mymodule資料夾中的IndexController.php中的類名改成Mymodule_IndexController。如果該Module名設成aaa,那麼就改成aaa_IndexController

。通常為了便於管理,Module名和資料夾名都是一致的。再次執行http://localhost:8002/Mymodule/

Z)CSL6N2%%33}~``Z@_R@YH

終於成功了。注意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/defaulthttp://localhost:8003/是等價的,ZF會自動匹配路由結構,獲取到對應的:module/:controller/:action/的值。


本文轉自cnn23711151CTO部落格,原文連結:http://blog.51cto.com/cnn237111/1290458 ,如需轉載請自行聯絡原作者


相關文章