2015-04-30 58 views
3

我在Laravel 4項目中使用存儲庫模式,但遇到了一些我認爲我做得不正確的事情。Laravel 4 - 在未返回被調用方法時從存儲庫重定向

在保存新用戶之前,我正在進行用戶驗證。

我在我的控制器的一個方法是:

public function addNewUser() { 
    $validation = $this->userCreator->validateUser($input); 

    if ($validation['success'] === false) 
    { 
     return Redirect::back() 
      ->withErrors($validation['errors']) 
      ->withInput($input); 
    } 

    return $this->userCreator->saveUser($input); 
} 

那麼的ValidateUser方法是:

public function validate($input) { 
    $rules = array(
     'first_name' => 'required', 
     'last_name' => 'required', 
     'email_address' => 'unique:users' 
    ); 

    $messages = [ 
    ]; 

    $validation = Validator::make($input, $rules, $messages); 

    if ($validation->fails()) 
    { 
     $failed = $validation->messages(); 
     $response = ['success' => false, 'errors' => $failed]; 
     return $response; 
    } 

    $response = ['success' => true]; 
    return $response; 
} 

這可能是好的,但我不喜歡在我的控制器做if語句?我寧願能夠在我的驗證類中處理這個問題。

但是爲了能夠從驗證類重定向,我需要返回控制器中的方法。

如果我然後想要5個方法調用,我不能全部歸還它們?

我想能夠簡單地按順序調用方法,然後在它們各自的類中處理我需要的內容,以及是否有任何錯誤重定向或處理它們。但如果一切正常,只需忽略它並轉到下一個功能。

所以例如:

public function addNewUser() 
{ 
    $this->userCreator->validateUser($input); 
    $this->userCreator->formatInput($input); 
    $this->userCreator->sendEmails($input); 
    return $this->userCreator->saveUser($input); 
} 

如果做在控制器聲明並不像我想那我可以繼續糟糕,但是這似乎不正確的?

+0

如果在控制器中使用thens,並且我一直這樣做,因爲控制器是存儲應用程序邏輯的地方,所以我沒有發現任何問題。我可能會將所有validateUser,formatInput和saveUser函數放入用戶控制器中稱爲store的單個函數中。然而,我將爲您從商店功能調用的sendEmails創建一個單獨的類。 – Joshua

+0

@Joshua控制器不應該在你的應用程序邏輯存儲的地方,它應該在服務中。 – ibanore

+0

@Joshua,控制器不需要知道實際的邏輯,它只是一個傳輸器。 – CodeRomeos

回答

0

對於存儲庫模式,您可以使用此: -

設置你的basemodel這樣

<?php namespace App; 

use Illuminate\Database\Eloquent\Model; 

class BaseModel extends Model{ 

    protected static $rules=null; 
    protected $errors=null; 


    public function validateForCreation($data) 
    { 
     $validation=\Validator::make($data,static::$rules); 
     if($validation->fails()) 
     { 
      $this->errors=$validation->messages(); 
      return false; 
     } 
     return true; 
    } 

    /** 
    * @return errors 
    */ 
    public function getErrors() { return $this->errors; } 
} 
現在

在你的倉庫中,添加這些方法

protected $model; 

protected $errors=null; 

public function model(){ return $this->model; } 

public function getErrors(){ return $this->errors; } 

public function create($inputs) 
{ 
    if(!$this->model->validateForCreation($inputs)) 
    { 
     $this->errors=$this->model->getErrors(); 
     return false; 
    } 
    $new=$this->model->create($inputs); 

    return $new; 
} 

,控制器將看像這樣..

public function postCreate(Request $request) 
{ 
    $inputs=$request->all(); 

    if($new=$this->repo->create($inputs)) 
    { 
     return redirect()->back() 
      ->with('flash_message','Created Successfully'); 
    } 
    return redirect()->back()->withInput()->withErrors($this->repo->getErrors()) 
     ->with('flash_message','Whoops! there is some problem with your input.'); 
}