2014-06-10 39 views
1

我正在用laravel構建一個簡單的應用程序,並且遇到了無法工作的重定向問題。我目前有一個註冊表單,該表單發佈到一個控制器方法,該方法在模型上調用一個靜態方法來處理驗證,並將該用戶保存到數據庫。Laravel - 從模型重定向?

這是我的代碼到目前爲止。

routes.php文件

Route::get('/', function() 
{ 
    return View::make('index'); 
}); 


Route::post('/sign_up', '[email protected]_user'); 

userController.php

public function create_user() 
{ 
    $data = Input::all(); 
    USER::validate($data); 
} 

user.php的現在

public static function validate($input) 
{ 


$rules = array 
(
    'firstname' => 'Required|Min:3|Max:80|Alpha', 
    'lastname' => 'Required|Min:3|Max:80|Alpha', 
    'password' =>'Required|AlphaNum|Between:4,12|Confirmed', 
    'password_confirmation'=>'Required|AlphaNum|Between:4,12' 
); 


$v = Validator::make($input, $rules); 
     if($v->passes()) 
     { 
      $user = new User; 
      $user->firstname = Input::get('firstname'); 
      $user->lastname = Input::get('lastname'); 
      $user->password = Input::get('password'); 
      return var_dump($user); // Save user code here 
     } 

      return Redirect::to('/')->withErrors($v); 


} 

,因爲它代表我只是得到一個空白屏幕。沒有錯誤,我甚至可以改變重定向:到我想要的任何路線,即使沒有設置,但仍然不會給出任何錯誤。

我還是設法得到它的工作使得對UserController的以下變化和用戶:

public function create_user() 
{ 
    $data = Input::all(); 
    $response = USER::validate($data); 

    **if($response == 2)** 
    { 
    return Redirect::to('/'); 
    } 
} 

user.php的

$v = Validator::make($input, $rules); 
     if($v->passes()) 
     { 
      $user = new User; 
      $user->firstname = Input::get('firstname'); 
      $user->lastname = Input::get('lastname'); 
      $user->password = Input::get('password'); 
      return var_dump($user); 
     } 

      return 2; 


} 

可正常工作調用來自控制器的重定向,而不是模型。

這使我想到了幾個問題。

  1. 爲什麼它在控制器而不是模型中工作,有沒有辦法使它按照我原先的意圖工作?

  2. 如果不是,我該如何從驗證中抓取錯誤?

  3. 這是一種糟糕的方式來佈局我的應用程序?我試圖保持模型中的邏輯步驟,但到目前爲止,將它投入控制器並完成它似乎更容易。

感謝您的回覆。

+2

如果你什麼'回報用戶::驗證($的數據);在你的控制器'? (控制器是爲了返回一個響應,這樣的重定向)順便說一句,我通常把所有的驗證和響應在控制器 –

+0

這工作!我對這種錯誤感到很失落,但你活着,你學習。謝謝! –

回答

1

您錯過了控制器中的return。您應該設置靜態函數的結果。

但是,我會分割它,所以你可以擁有你的控制器中的所有東西,因爲它非常簡單。如果你有更多的代碼,你可以考慮創建一個UserValidation class

此外,我會把規則放在一個配置文件中,您可以隨時撥打電話。這樣你就不會在你的驗證中硬編碼你的規則,你可以在一個文件中編輯你的應用程序的所有驗證規則。

控制器

public function create_user() 
{ 
    $data = Input::all(); 
    USER::validate($data); 

    $v = Validator::make($input, \Config::get('Foo.Rules')); 
    if($v->passes()) 
    { 
     self::insert_user($data); 
    } 

     return Redirect::to('/')->withErrors($v); 
} 

//This could be in a user validation class 
public function insert_user($data){ 

    $user = new User; 
    $user->firstname = Input::get('firstname'); 
    $user->lastname = Input::get('lastname'); 
    $user->password = Input::get('password'); 
    return var_dump($user); // Save user code here 
} 

配置美孚

$rules = array 
(
    'firstname' => 'Required|Min:3|Max:80|Alpha', 
    'lastname' => 'Required|Min:3|Max:80|Alpha', 
    'password' =>'Required|AlphaNum|Between:4,12|Confirmed', 
    'password_confirmation'=>'Required|AlphaNum|Between:4,12' 
), 
0
  1. 控制器是那個的意思返回響應,而不是驗證的一個 - 你可能通過這一回控制器則使控制器返回它 - 但是這不是真正的目的。

  2. 你可能會返回驗證對象本身:

return $this;

,然後在你的控制器,你可以得到錯誤信息

$error = $response->messages();

  1. 它通常是保持分離的好主意e使您的應用程序保持乾爽,這使查找和修復錯誤更容易 - 但這真的取決於您 - 工程設計也可能成爲問題。