2014-09-27 59 views
0

我有一個最佳實踐問題。PRG BestPractice Zf2

它清楚Post/Redirect/Get的作用,但是處理它們的最佳實踐是什麼?

我認爲有2種方法來處理它們。

1.)我們首先在控制器動作 上調用prg插件。2.)我們首先驗證發佈數據,並且只有在成功時才重定向到prg-response?

我對這個問題,在

1)我們放大,因爲重定向的響應時間,這是在默認情況下,所以我認爲不是最好的解決

2)將創建一個開銷通過每次驗證的形式

你是什麼意思是更好的解決方案這種情況?

問候

UPDATE:

我的意思是,正常(標準)的情況下是這樣的 - http://framework.zend.com/manual/2.0/en/modules/zend.mvc.plugins.html#the-post-redirect-get-plugin

$prg = $this->prg('url'); 
if ($prg instanceof Response) { 
    return $prg; 
} elseif ($prg === false) { 
    return new ViewModel(array(...)); 
} 

$form->setData($prg); 

這意味着,在每個表單提交重定向之後執行。 現在,我的想法是這樣的:

$prg = $this->prg(); 
$form = $this->getFormLogin(); 

$data = ($prg instanceof ResponseInterface) 
      ? $this->getRequest()->getPost() 
      : $prg; 

if (false !== $data) { 
    $form->setData($data); 
    if (true === $form->isValid()) { 
     if ($prg instanceOf ResponseInterface) { 
      return $prg; 
     } 

    // Make something within the loginservice or something else 
} 

這背後的想法是,只有重定向的PRG只有形式是有效的,以節省響應時間和其他的東西(因爲引導設置等。 )

回答

0

Zend Framework是基於Front-Controller模式設計的,因此它在訪問不同資源(controller-action)時重定向頁面至關重要。此外,當您從源代碼中引發重定向(URL)功能時,比較從瀏覽器訪問相同(URL)的時間時花費的時間很少。

當您使用classmap_autoloading時,您可以將響應時間縮短到相當可觀的數量。

更新時間:

的一個例子,我需要登錄過程,在下面的代碼我同時實現HTTP GET和POST方法在相同的動作(),但是,你可以重構基於HTTP方法這個功能。

LoginController.php

public function loginAction() 
{ 
    //code 
    if ($request->isPost()) { 
    //code 
    if ($isValid) { 
     return $this->redirect()->toUrl('urUrl'); 
    } 
    return $this->redirect()->toUrl('urUrl'); 
    } 
    //code 
    return $viewModel; 
} 

上面的代碼

//it used for HTTP get 
    public function loginAction() 
    {  
     //code 
     return $viewModel; 
    } 

    //it used for HTTP POST 
    public function loginPostAction() 
    {  
     //code 
     if ($notValid) { 
      return $this->redirect()->toUrl('urUrl'); 
     } 
     $viewModel->setTemplate($viewpath); 
     return $viewModel; 
    } 

重構後,您需要修改以這樣的方式您的路由配置,以處理這兩個HTTP GET和POST方法。如果請求是HTTP-GET控制器過程中則loginAction(),但如果其HTTP-POST它處理loginPostAction()

Zend framework 2 - HTTP method Routing

更新: 插件的目的是爲了避免用戶將數據再次發佈到瀏覽器。在你的情況下,你試圖啓用該選項,當表單無效(you are trying to change the behaviour of PRG plugin)時發佈他們的數據。如果你真的擔心響應時間不要使用PRG插件。在您的控制器操作中創建您的自定義邏輯。

--SJ

+0

嗨,thx爲您的答案。在這種情況下我不明白的是,「比較訪問相同資源的時間」,在我的情況下,重定向url與調用者url相同。我指的是第2點)是,我排除重定向這麼長的數據是有效的,在這兩種方法的資源調用是相同的,只有重定向將排除,關於 – user3549136 2014-09-29 14:31:48

+0

@ user3549136,我更新了我的答案。我不明白你真的問我什麼。你能通過使用上面的loginAction()來澄清你的問題嗎? – 2014-09-30 05:18:16

+0

我已經更新了我的問題,希望能澄清我的問題?問題是在這種情況下,僅在有效的表單上處理PRG纔有意義?問候 – user3549136 2014-09-30 23:31:51