2009-10-30 83 views
21

我想某人向我解釋_forward正在做什麼,我看不到_forward是否也將附加視圖呈現給動作或僅執行動作。

也有可能在視圖腳本中將參數傳遞給$ this-> action?

更一般地說,我的問題是如何編碼確認頁面,讓我們說,用戶輸入一些東西,你想向他證實確認,向前是意味着這種情況?

+0

@jldupont感謝您的標記編輯忘記了php ^^ – RageZ 2009-10-30 01:53:49

+0

我已經給我的問題添加了幾句話 – RageZ 2009-10-30 02:56:09

回答

22

_forward是一個內部重定向。在_redirect發送一個標題,告訴客戶端的瀏覽器轉到其他URL時,_forward會告訴Dispatcher在內部將請求重定向到其他地方。

如果你考慮的正常調度命令:

preDispatch() 
someAction() 
postDispatch() 

在該進程的任何一點調用_forward將導致下面的步驟不被執行。因此,如果您在preDispatch()中調用_forward,則不會調用someAction(),依此類推。如果您在someAction()中使用_forward(),並且您使用viewRenderer動作助手呈現視圖(您正在讓框架選擇要呈現的視圖腳本),則不會在someAction()中呈現視圖腳本。

當請求被轉發到新的控制器/模塊時,整個調度過程將在那裏重複。

你可以找出被分派什麼行動使用:

$action = $this->getRequest()->getParam('action'); 

$行動將成爲行動的URL形式,因此,如果該方法是名爲「someKindOfAction」,$行動將包含「some-有點'。您也可以爲控制器和模塊執行此操作。

9

我與Zend的經驗是有限的,我希望我沒有展示你的東西,你已經看到,但according to the docs(12.7.6實用方法):

_forward($行動,$控制器= null,$ module = null,array $ params = null):執行另一個操作。 如果在preDispatch()中調用,則當前請求的動作將被跳過,以支持新動作。否則,在處理完當前操作之後,將執行_forward()中所請求的操作。

所以這聽起來像是什麼時候它被稱爲重要的上下文。在後一種情況下,它將首先執行被稱爲的動作,然後執行轉發的動作。當它從preDispatch handler

+0

karim謝謝你的回答,但我遇到了幾件事情沒有做我期望的事情..加上我找到了doc(至少)這種神祕的一種。如果我打電話給$ this-> forward並且我已經在使用 – RageZ 2009-10-30 02:54:56

2

被調用時,例外是我發誓曾經在那裏的框架文檔的一部分解釋了一般級別的調度工作流程。 Theres this diagram,但它很好解釋_forward做了什麼。

當在一個動作_forward將設置$request->isDispatched = false,並設置調用_forward中指定的控制器/動作的請求。在postDispatch期間,檢查isDispatched - 如果它爲false,則整個事件使用新的請求再次運行。

所以......如果在你的動作中你手動渲染視圖,它們仍然會被渲染。行動中的一切仍將發生,其他行動也將在此後發生。

[編輯後的問題編輯]

前鋒並不意味着該響應/確認,之後員額 - 使用重定向爲。 $this->_helper->redirector->gotoUrl()

+2

那麼該圖表現在失敗。 – leek 2010-05-07 03:42:07

3

前鋒換貨時要使用外部重定向是不正確的選項。 用例(位ankward,但最好的,我可以彌補): 您有可以添加你的寵物(無論是狗或貓)的形式。你有不同的模型。你在表格中加入一個選擇來選擇狗/貓。然後在你的行動中,你這樣做:

if($form->isValid($_POST)){ 
    switch($form->select->getValue()){ 
    case "dog": 
     $this->_forward('add-dog','pets','default'); 
     break; 
    case "cat": 
     $this->_forward('add-cat','pets','default'); 
     break;  
    } 
} 

而你在不同的行動中處理貓和狗的不同事情。這樣做的好處是所有的參數都一起發送。相反,當你使用$ this - > _ redirect()時,POST參數將會丟失。這是在某些情況下,打算添加註釋後的行爲(比如你做一個重定向到評論列表頁面,以避免重複的帖子和消息「頁面需要重新發送數據...」。

9

我認爲這是非常重要的注意_forward是非常低效的,你應該總是直接調用你的方法,當你執行一個_forward時,init(),pre和post dispatch再次運行,根據init中的內容,你可以運行(並插入)同樣的數據庫記錄兩次

它很容易使用但浪費如果你剖析你的代碼,並且正在猛擊你的頭,爲什麼一切都被調用了兩次,_forward是原因,如果你喜歡我和你實例化爲了在整個類中使用init()中的少量對象,您可以將所有事情都實例化WICE!我在我的代碼上加載了測試,並通過直接調用動作名稱(如foo())而不是_forward('foo')來獲得更好的性能。

另一個題外話提示我想大多數人都知道,它是用單引號儘可能正弦PHP解析器來檢查嵌入式變量的字符串。我不知道這會給你帶來多少現實世界的性能,尤其是如果你使用的是操作碼緩存,但這是一個最佳實踐。

+0

我看到你的觀點與調度再次運行,唯一的事情,當你想在同一個控制器直接調用該方法轉發更好,但是當它是一個不同的控制器,你可能不得不手動初始化很多東西,即'$ this- > _request' – RageZ 2010-03-26 04:50:45

+0

,在我的情況下,我使用也爲登錄檢查用,即頁面您應該驗證,但你是不是這樣顯示登錄頁面...和我的登錄/註銷代碼總是在一個單獨的控制器(在大多數情況) – RageZ 2010-03-26 04:51:56

+0

丹,我相信你的說法是部分不正確:「當你做一個_forward,在init(),前和後再次調度運行取決於你在你的init什麼,你可以運行(與插入)相同數據庫記錄兩次。「 實際上,init只在調度器中被調用一次......前後調度被多次調用。 – joedevon 2010-08-27 04:39:49

相關問題