2014-02-06 18 views
2

在Codeigniter中,我曾經在發佈數據後調用視圖函數。如下所示;Laravel:發佈後加載視圖

例如:我有一個show_products()函數,它將顯示產品列表。當用戶添加新產品時,我將數據發佈到add_product()函數中。如果這個過程是成功的,我會重定向到產品頁面,而不是裝載add_product()像這裏面的顯示功能:

//Inside the add_product() function 
if(success){ 

    $this->show_products(); 

} 

我認爲,沒有再重新加載頁面的點。由於我們已經在post函數中,所以我們可以直接在數據庫插入後設置視圖。

但是在laravel中,我發現人們在發佈數據後重定向。

例如:

//Inside the postProduct() function 
if(success){ 

    return Redirect::to('products'); 

} 

我試過;

//Inside the postProduct() function 
if(success){ 

    $this->getIndex();// this is my product display function 

} 

但它沒有工作。

通過在post函數中加載視圖而無需每次都重定向,我們是否有優勢?

如果是這樣,我怎樣才能達到laravel同樣的事情?

非常感謝!

回答

4

這不是關於Laravel,相反,它是關於一個做事的好還是正確的方式。換句話說,在成功提交表單後,重定向到其他路由/頁面是一種很好的編程習慣。

即使在CodeIgniter或純Php我喜歡這種方法,並鼓勵其他開發人員這樣做。所以,問題是爲什麼這個重定向比直接調用另一個方法來顯示另一個視圖/頁面更好?

這是過程的生命週期:

  1. 您發佈形式的路由/操作頁面。
  2. 驗證提交的數據,並在驗證成功後,將提交的數據插入到數據庫中,否則將重定向迴帶有錯誤和舊用戶輸入的表單。

所以。假設你已經提交了一個表單,併成功地將數據保存到數據庫中。當你保存它,你做了這樣的事情:

return View::make('...')->with('success', 'Data saved!'); 

在這種情況下,用戶可以在屏幕上看到的success消息,但如果用戶,按從鍵盤的F5關鍵refresh頁面(可能意外),表單將再次提交給同一個動作,整個過程將再次重複。

因此,如果您在表單提交後有重定向,那麼refreshing頁面不會再對該表單提出任何請求。

谷歌在form resubmit on refresh.上的搜索結果,檢查鏈接,可能是第一個/兩個,你會更好地瞭解問題和表單提交後重定向的好處。

1

在Codeigniter中重定向頁面我們有redirect()函數。

if(success){ 
    redirect('products'); 
} 
+0

嗨Moorthy GK,謝謝,但我不想重定向我要加載的POST函數內部的看法。如果你重定向,我認爲你正在做的一個。更多額外的步驟 –

1

您不必返回Redirect。人們常常使用它的原因是因爲它很舒服。

你可以返回其他的東西,例如。一種觀點:

return View::make('home.index')->with('var',$var); 
+0

謝謝湯姆,而不是製作視圖,我可以重用我已有的功能。像$ this-> getIndex(); ? –

+0

在Laravel 3中它的工作原理,在L4中我認爲它也應該起作用,但是IMO是一個糟糕的方法。如果你這樣做,你必須經常檢查所有需要的變量。使用'Return :: redirect()'保證沒有問題,你可以保持你的代碼乾爽。此外 - 重定向僅在控制器之間的laravel內部重定向路由,因此在調用它之後,總共只有一個html響應生成。 – Tom

+0

忘了關於一件事 - 你也可以重定向到控制器(不僅僅是一個路線) – Tom

0

在Laravel,重定向做一個POST後,你可以返回重定向有一個名爲路線:

return redirect()->route('my-route-name'); 

或者,如果你是有需要的路徑方法(控制器內如index方法,你可以這樣做,以及:

return self::index();