2 4 請求物件

2021-07-03 16:44:27 字數 4093 閱讀 7117

2.4.1. 介紹

請求物件是在前端控制器,路由器,分發器,以及控制類間傳遞的簡單值物件。請求物件封裝了請求的模組,控制器,動作以及可選的引數,還包括其他的請求環境,如http,cli,php-gtk。

模組名可通過getmodulename()和setmodulename()訪問。 

控制器名可通過getcontrollername()和setcontrollername()訪問。

控制器呼叫的動作名稱可通過getactionname()和setactionname()訪問。

可選引數是乙個鍵值對的關聯陣列。陣列可通過getparams()和 setparams()獲取及設定,

單個引數可以通過 getparam() 和

setparam()獲取及設定。

基於請求的型別存在更多的可用方法。預設的zend_controller_request_http請求物件,擁有訪問請求url、路徑資訊、$_get 和 $_post引數的方法等等。

請求物件先被傳入到前端控制器。如果沒有提供請求物件,它將在分發過程的開始、任何路由過程發生之前例項化。請求物件將被傳遞到分發鏈中的每個物件。

而且,請求物件在測試中是很有用的。開發人員可根據需要搭建請求環境,包括模組、控制器、動作、引數、uri等等,並且將其傳入前端控制器來測試程式流向。如果與響應物件配合,可以對mvc程式進行精確巧妙的單元測試(unit testing)。

2.4.2. http 請求

2.4.2.1. 訪問請求資料

zend_controller_request_http封裝了對相關值的訪問,如控制器和動作路由器變數的鍵名和值,從url解析的附加引數。它還允許訪問作為公共成員的超全域性變數,管理當前的基位址(base url)和請求uri。超全域性變數不能在請求物件中賦值,但可以通過setparam/getparam方法設定/獲取使用者引數。

超全域性資料 

通過zend_controller_request_http訪問公共成員屬性的超全域性資料,有必要認識到一點,

這些屬性名(超全域性陣列的鍵)按照特定次序匹配超

全域性變數:

1.get,2.post,3. cookie,4.

server,5. env。

特定的超全域性變數也可以選擇特定的方法來訪問,如$_post['user']可以呼叫請求物件的getpost('user')訪問,getquery()可以獲取$_get元素,getheader()可以獲取請求訊息頭。

get和post資料 

需要注意:在請求物件中訪問資料是沒有經過任何過濾的,路由器和分發器根據任務來驗證過濾資料,

但在請求物件中沒有任何處理。

也獲取原始 (raw) post 資料! 

從 1.5

.0 開始,也可以通過 getrawbody() 方法獲取原始 post 資料。

如果沒有資料以那種方式提交,該方法返回 false,

但 post 的全體(full boday)是個例外。

當開發乙個 restful mvc 程式,

這個對於接受內容相當有用。

可以在請求物件中使用setparam() 和getparam()來設定和獲取使用者引數。 路由器根據請求uri中的引數,利用這項功能請求物件設定引數。

getparam

()不只可以獲取使用者引數

getparam

()事實上從幾個資源中獲取引數。根據優先順序排序:通過setparam

()設定的使用者引數,

get 引數,最後是post引數。

通過該方法獲取資料時需要注意這點。

如果你希望從你通過 setparam() 設定的引數中獲取(引數),使用 getuserparam()。

另外,從 1.5.0 開始,可以鎖定搜尋哪個引數源,setparamsources() 允許指定乙個空陣列或者乙個帶有乙個或多個指示哪個引數源被允許(預設兩者都被允許)的值 『_get』或』_post』的陣列;如果想限制只訪問 『_get』,那麼指定 setparamsources(array(『_get』)) 。

2.4.2.2. 基位址和子目錄

zend_controller_request_http允許在子目錄中使用zend_controller_router_rewrite。zend_controller_request_http試圖自動的檢測你的基位址,並進行相應的設定。

url檢測區分大小寫 

基位址的自動檢測是區分大小寫的,因此需要確保url與檔案系統中的子目錄匹配。否則將會引發異常。

如果基位址經檢測不正確,可以利用zend_controller_request_http或者zend_controller_front類的setbaseurl()方法設定自己的基路徑。zend_controller_front設定最容易,它將匯入基位址到請求物件。定製基位址的用法舉例:

<?php 

/** * dispatch request with custom base url with zend_controller_front.

*/$router

=new zend_controller_router_rewrite();

$controller

= zend_controller_front::getinstance();

$controller

->setrouter($router)

$response

=$controller

->dispatch();

2.4.2.3. 決定請求方式getmethod() 允許你決定用於請求當前資源的 http 請求方法。另外,當詢問是否乙個請求的特定型別是否已經存在,有許多方法允許你獲得布林響應:

isget

()ispost

()isput

()isdelete

()ishead

()isoptions

()

這些基本用例是來建立 restful mvc 架構的。

2.4.2.4. 刪除 ajax 請求

zend_controller_request_http 有乙個初步的方法用來檢測ajax請求:isxmlhttprequest()。這個方法尋找乙個帶有』xmlhttprequest』 值的http請求頭x-requested-with;如果發現,就返回true。

當前,這個頭用下列js庫預設地傳遞:

prototype/scriptaculous (and libraries derived from prototype)

yahoo! ui library

jquery

mochikit

大多數 ajax 庫允許傳送定製的http請求頭;如果你的庫沒有傳送這個頭,簡單地把它作為乙個請求頭新增上確保isxmlhttprequest() 方法工作。

2.4.3. 子類化請求物件

所有請求物件的基請求類是抽象類zend_controller_request_abstract。定義了一些最基本的方法:

abstract class zend_controller_request_abstract

請求物件是請求環境的容器。控制器鏈實際上只需要知道如何設定和獲取控制器、動作,可選的引數以及分發的狀態。預設的,請求將使用controller和action鍵查詢自己的引數來確定控制器和動作。

需要乙個請求類來與特定的環境互動以獲得需要的資料時,可以擴充套件該基類或它的衍生類。例如http環境,cli環境,或者php-gtk環境。

24函式物件

函式物件指的是函式可以被當成變數去使用 deffoo 函式的記憶體位址 print from foo 可以被賦值 f foo print f is foo f 可以當作引數傳給乙個函式 defbar func print func func bar foo 可以當成乙個函式的返回值 defbar f...

flask 請求物件

flask通過上下文變數request對外開放請求物件如下表 屬性或方法 說明form 乙個字典,儲存請求提交的所有表單字段 args 乙個字典,儲存通過url查詢字元傳遞的所有引數 values 乙個字典,form和args的集合 cookies 乙個字典,儲存請求的所有cookie header...

Request請求物件

一 request物件由伺服器建立,我們使用 瀏覽器訪問伺服器資源原理 二 request體系結構 其中,servlet 的service 方法引數列表是 servletrequest物件,httpservlet 的 doget 和 dopost 方法引數列表是用的 httpservletreque...