Zend_Controller進階
在前邊的例子中,我們的index.php引導文件所在的文件夾與控制器、視圖等所在的文件夾是不同的,這并不符合一般網站項目的文件夾的組織習慣。從本部分開始,我們把他們放在同一個文件夾中,這是因為ZF提供了靈活的文件夾組織和配置能力。
我們新的文件夾結構如下: …/htdocs
library
Zend
test.zf.com
controllers
models
views
index.php
.htaccess
即把原來app_phpchina1.com文件夾下的子文件夾Controllers、models、views轉移到文件夾phpchina1.com下,與index.php和.htaccess文件放在一起。為了不覆蓋原來的代碼,我們把原來的phpchina1.com文件夾拷貝一份,命名為test.zf.com。
為了測試,我們建立一個新的虛擬主機test.zf.com。這可以仿照前面的phpchina1.com來完成,即在httpd.conf中添加:<VirtualHost *:8080>
ServerAdmin [email protected]
DocumentRoot “C:/PRogram Files/Apache Software Foundation/Apache2.2/htdocs/test.zf.com”
ServerName test.zf.com
ErrorLog “logs/test.zf.com-error.log”
CustomLog “logs/test.zf.com-access.log” common
</VirtualHost>
重新啟動Apache服務。
然后再在hosts文件中加一條
<服務器ip> phpchina1.com
以后即可以以http://test.zf.com:8080/*.*的形式訪問新的網站。但現在暫時還不能像前邊的例子一樣運行原來的示例代碼,因為還需要對index.php里的路徑配置進行調整。
我們把語句PATH_SEPARATOR . ‘../App_phpchina1.com/models/’修改為:
PATH_SEPARATOR . ‘models/’
把語句”default”=>’../app_phpchina1.com/controllers’修改為:
“default”=>’controllers’
然后用瀏覽器打開地址http://test.zf.com:8080,就可以看到和原來一樣,顯示了字符串“Hello PHPChina1.com!”。也可以打開http://test.zf.com:8080/news顯示“Welcome to News!”字符串。
下一步我們對Controllers進行擴展改造。比如我們有這樣的需求:如果一個網站項目很大,有多個模塊,Controllers文件夾下將有大量的控制器文件,我們打算通過按模塊建立子文件夾對其進行分類存放,IndexController.php控制器文件存放在index文件夾下,news控制器文件存放在news文件夾下。
首先修改index.php文件,把
$fc->setControllerDirectory(array(
“default”=>’controllers’,
));
處的”default”=>’controllers’修改為
“default”=>’controllers/index’
這時http://test.zf.com:8080地址就可以打開了,顯示結果與原來相同。
但要訪問news文件夾下的NewsController.php控制器,必須把news添加到搜索路徑,并為其命名,我們這里命名為other模塊,這樣我們就添加以下語句:
$fc->addControllerDirectory(’controllers/news’, ‘other’);
然后打開地址http://test.zf.com:8080/news,看不到原來的結果。
再打開地址http://test.zf.com:8080/other和http://test.zf.com:8080/other/news,也看不到原來的結果。
原來,需要修改NewsController.php中的語句
Class NewsController extends Zend_Controller_Action為
class other_NewsController extends Zend_Controller_Action
即在類名前加“other_”字符串。然后訪問地址
http://test.zf.com:8080/other/news
即可得到正確的結果。
這里有一個新問題,即http://test.zf.com:8080/other/news和index默認文件夾的
OtherController控制器中的newsAction方法訪問路徑是相同的,如果index文件夾下同時還有文件OtherController.php,內容為:<?php
class OtherController extends Zend_Controller_Action
{
function newsAction()
{
echo “This is OtherController.php ==> newAction”;
}
}
?>
那么http://test.zf.com:8080/other/news會不會顯示
This is OtherController.php ==> newAction
字符串的結果呢?不會的,因為按模塊搜索訪問方式優先。有了other搜素路徑名,就不能再訪問默認文件夾下的other控制器中的任何方法了,即使搜素路徑下沒有任何對應的控制器文件,也不能訪問。即,即使沒有news文件夾下的NewsController.php文件,http://test.zf.com:8080/other/news也不會獲得index文件夾下OtherController.php中newsAction方法的結果。
這里的搜素路徑和Web服務器的虛擬路徑有點相似。但是因為可以用代碼指定,所以更靈活一些。后面,我們根據這一點可以靈活的組織網站項目的文件夾結構。
我們對前邊ZF中請求URL的格式做一些補充,原URL格式
http://host_name/controller_name/action_name/param1/ value1/param2/ value2…
可以擴展為:
http://host_name/路徑/controller_name/action_name/param1/ value1/param2/ value2…
路徑名需要作為“路徑名_”字符串的形式加在
代碼“Class controller_name”的實現代碼的前邊,成為“Class路徑名_controller_name”的形式。明白了這點,在分析ZF的源代碼的時候,就不會被路徑問題所迷惑了。
|
新聞熱點
疑難解答