麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

走進Zend Framework框架編程4(Zend_Controller和引導文件)

2019-11-17 04:11:20
字體:
來源:轉載
供稿:網友

Zend_Controller和引導文件

上一節的基本示例已經運行成功,說明ZF已經開始工作了。這一部分我首先引入Zend_Controller的概念,再對引導文件index.php做一個詳細的解釋。
1,理解Zend_Controller
Zend_Controller是ZF的MVC體系的核心部份。
Front Controller(前端控制器)設計模式具體是由Zend_Controller_Front靜態類實現的,所有的請求都必須通過前端控制器,并基于請求的URL被分發(dispatch)到不同的控制器去來處理。
Zend_Controller體系具有可擴展性,可以通過繼承已有的類,或者通過實現各種接口和繼承抽象類來寫自己的擴展類,也可以編寫插件或者助手類(helper)來增強系統的功能。
Zend_Controller_Front類的聲明和所有初始化工作,以及執行dispatch()方法等都是在Bootstrap文件即入口程序中完成的,在ZF中,通常就是指index.php文件。因為用戶的所有請求都是從index.php進入的,所以需要配置Web服務器,把所有請求導向到index.php文件中,這些我們在前邊已經完成了,而這里我們已經對其原因有了更深入的理解。
2,理解ZF是如何處理HTTP請求的:
例如有一個URL請求地址http://host_name/controller_name/action_name
其中host_name一般是一個域名,例如www.why100000.com。默認情況下,該URL的第一個部份controller_name會映射到一個控制器,第二個部份action_name則映射到控制器類中的Action(控制器類內部的一個方法)。在本例中,其服務器路徑為/controller_name/action_name,則會映射到controller_name控制器和action_name這個Action。如果不存在該action,則會默認調用index這個action。如果控制器不存在,則會默認自動調用index控制器(按照Apache的命名慣例,將自動映射到DirectoryIndex文件)。
接下來,Zend_Controller的dispatcher會根據控制器的名稱找到具體的控制器類。通常它會把控制器名稱加上Controller。因此,上例中controller_name控制器與controller_name Controller類相對應。
類似地,action會映射到控制器類中的一個方法。默認情況下,會被轉成小寫字母,然后加上“Action”字符串。因此,上例中action_name這個action與 action_name Action相對應。于是最終我們訪問URL調用的是
controller_name Controller-> action_name Action()
方法。
控制器類保存為controller文件夾下的一個php文件中,文件名前綴約定與controller類的名字相同。例如Controller_nameController.php。
現在我們根據以上約定創建一個控制器和Action方法:<?php

class Controller_nameController extends Zend_Controller_Action

{

  function action_nameAction()

  {

……

}

}

?>

復制代碼以上代碼需要以文件名Controller_nameController.php保存,并存放到controllers文件夾下。
ZF有一個約定,就是當url中不指定控制器名時,默認為index控制器;當不指定action名時,默認為index action。于是,當控制器名和action都不指定時,就執行index控制器類的indexAction方法,這時類文件形如:<?php

class IndexController extends Zend_Controller_Action

{

  function indexAction()

  {

……

}

}

?>

復制代碼該代碼保存為IndexController.php文件名。
一般的控制器類都有一個indexAction函數,作為控制器的默認方法。
注意在url中,控制器名和action可以同時省略:即形如http://host_name/
也可以省略action名,執行indexAction方法,形如http://host_name/controller_name/
但不能省略控制器名而指定action名,即
http://host_name//action_name
是不正確的。
形如http://host_name/xxx的地址,xxx被認為是控制器名。
對于我們上一節的示例,當用瀏覽器打開地址http://phpchica1.com:8080,其實執行的是IndexController控制器類的indexAction方法,執行了語句
echo “Hello PHPChina1.com!”;
而我們在IndexController控制器類中再建立一個成員函數:function otherAction()

  {

echo “this is other Action.”;
http://www.companysz.com/
  }
復制代碼在瀏覽器地址欄輸入http://phpchica1.com:8080/index/other,將會輸出字符串“this is other Action.”。
3,對引導(bootstrap)文件index.php的解釋
error_reporting(E_ALL|E_STRICT);語句打開了錯誤輸出開關,用于代碼調試,正式發布的代碼應該屏蔽錯誤信息。
date_default_timezone_set(’Asia/Shanghai’);設定時區,該語句不能省略。
set_include_path(……);很關鍵的語句。用于設定類庫的包含路徑,ZF的系統類庫就是在這里指定的。注意如果php.ini文件里的include_path包含了ZF類庫的路徑,這里就可以不用包含../library路徑。但是在自己的代碼里指定ZF類庫路徑更方便一些,一般推薦這么做。../App_phpchina.com/models/路徑下包含我們自己開發的自定義類文件。沒有自定義類文件,可以不用包含該路徑。get_include_path再取得php.ini的其他包含路徑,一同指定我們的應用程序使用。
include “Zend/Loader.php”;語句裝載ZF的類加載器。Zend/Loader.php正是從../library路徑下取得的。
Zend_Loader::registerAutoload();自動加載類。該語句可以分別用以下兩段代碼代替,效果相同:
第一段代碼:
  function __autoload($class)
  {  Zend_Loader::loadClass($class);  }
第二段代碼:
  Zend_Loader::loadClass(’Zend_Controller_Front’);
$fc = Zend_Controller_Front::getInstance();取得Zend_Controller_Front類實例。
$fc->setControllerDirectory(……);指定一組控制器文件路徑,參數是數組。讓前端控制器知道從哪里去找我們的控制器類。如果僅有一個控制器文件夾,也可以寫成:
$fc->setControllerDirectory(’../App_www.mydomain.com/controllers’);
$fc->throwExceptions(true);設置拋出錯誤信息。
$fc->setParam(’xxx’, true);格式的語句用于設置一些參數。
其中$fc->setParam(’noViewRenderer’, true);指明不使用視圖,false 是默認值。
$fc->dispatch();語句開始執行分發,導向到請求的控制器執行后續代碼。
這是一個功能較少的、典型的bootstrap引導文件,每個ZF應用中,該文件大同小異,只是個別參數設置不同。這個文件可以作為一個模板,拷貝到其他ZF應用中使用。這個文件與ZF應用的文件夾結構有直接關系,配置時一定要仔細。調整一些參數后可以使ZF有一些其他的額外功能。這點我們以后還會接觸到。
4,ZF中請求URL的格式
Zend Framework的控制器 Zend_Controller使網站支持“干凈的URL”。它把對控制器、方法的請求和參數的傳遞變形為對文件夾的訪問形式。URL的完整格式為:
http://host_name/controller_name/action_name/param1/ value1/param2/ value2…
除過前邊的host_name外,controller_name和action_name為控制器和方法名,后邊的殘出和值必須一一對應。
傳遞的參數,在action方法中以 $this->_getParam(”參數名”);的方法來取得其值。
因為有嚴格的對應關系,一般在有參數傳遞的情況下,控制器和action的名字都不能省略,否則會出現歧義。
我們現在在
C:/PRogram Files/Apache Software Foundation/Apache2.2/htdocs/app_phpchina1.com
/controllers
文件夾下建立一個NewsController.php文件,內容為:<?php

  class NewsController extends Zend_Controller_Action

  {

function indexAction()

{

  echo “Welcome to News!”;

}

function pageAction()

{

  $id = $this->_getParam(”id”);

  echo “ID: “.$id.”<BR>”;

  $type = $this->_getParam(”type”);

  echo “TYPE: “.$type.”<BR>”;

}

  }

?>

復制代碼然后我們以http://phpchina1.com:8080/news/page/id/001/type/typename地址訪問該文件,會得到以下顯示結果,可以看到已經正確的獲得了傳遞的參數:
ID: 001
TYPE: typename
我們看到,ZF訪問框架內的控制器方法,不是通過從url中訪問控制器類php文件來實現的,而是在index.php中前端控制器的控制下對對應的控制器及其方法進行訪問,一切過程和細節都被ZF框架屏蔽了,我們只要寫出正確的url就能訪問到對應的程序邏輯。
我們可以試著訪問http://phpchina1.com:8080/index.php地址,實際上執行的還是IndexController控制器的indexAction方法,輸出字符串“Hello PHPChina1.com!”。而想直接訪問IndexController.php和NewsController.php文件,我們甚至連它們的url路徑是什么都無法知道。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 蜜桃视频在线免费播放 | 亚洲成在人| 日韩视频―中文字幕 | 91精品国产乱码久久久久 | 日本残忍极度灌浣肠视频 | 欧美a∨亚洲欧美亚洲 | 新久草在线视频 | 欧美精品v国产精品v日韩精品 | 精品一区二区三区不卡 | 欧美成人午夜精品久久久 | 一区二区美女视频 | 欧美成人精品一区二区 | 久久视频精品 | 毛片在线免费 | 在线区 | 午夜精品久久久久久久96蜜桃 | 久热久操 | 成人在线视频在线观看 | 7777视频| 国产精品久久久久网站 | 国产精品视频自拍 | 欧美精品色精品一区二区三区 | 日本一区二区高清不卡 | 国产欧美精品综合一区 | 成人福利在线播放 | 毛片在线播放视频 | 精品一区二区三区在线观看视频 | 国产激情精品一区二区三区 | 日本aaaa片毛片免费观看视频 | 日韩精品 | 欧美精品第1页 | 牛牛a级毛片在线播放 | 免费欧美一级视频 | 小情侣嗯啊哦视频www | 在线观看中文字幕av | av噜噜噜噜 | 亚洲视屏 | av色先锋| 国产激情精品一区二区三区 | 成人午夜视屏 | 日韩av电影在线观看 |