2015-05-25 127 views
2

因此,我試圖將我所有的驗證規則分組到文件夾中的相應文件以便於維護。下面是我的文件夾結構的樣子:Laravel 5 __construct()參數傳遞錯誤

Project 
--app 
--config 
--(more folders) 
--domains 
----App 
--------Entities 
--------Repositories 
--------Services 
--------Validators 
----Core 
--------Validators 

所以我想實現的是下核心\校驗我創建了一個LaravelValidator.php它看起來像這樣

<?php namespace Core\Validators; 

use Validator; 

abstract class LaravelValidator { 

     /** 
     * Validator 
     * 
     * @var \Illuminate\Validation\Factory 
     */ 
     protected $validator; 

     /** 
     * Validation data key => value array 
     * 
     * @var Array 
     */ 
     protected $data = array(); 

     /** 
     * Validation errors 
     * 
     * @var Array 
     */ 
     protected $errors = array(); 

     /** 
     * Validation rules 
     * 
     * @var Array 
     */ 
     protected $rules = array(); 

     /** 
     * Custom validation messages 
     * 
     * @var Array 
     */ 
     protected $messages = array(); 

     public function __construct(Validator $validator) 
     { 
       $this->validator = $validator; 
     } 

     /** 
     * Set data to validate 
     * 
     * @return \Services\Validations\AbstractLaravelValidator 
     */ 
     public function with(array $data) 
     { 
       $this->data = $data; 

       return $this; 
     } 

     /** 
     * Validation passes or fails 
     * 
     * @return Boolean 
     */ 
     public function passes() 
     { 
       $validator = Validator::make(
         $this->data, 
         $this->rules, 
         $this->messages 
       ); 

       if ($validator->fails()) 
       { 
         $this->errors = $validator->messages(); 

         return false; 
       } 

       return true; 
     } 

     /** 
     * Return errors, if any 
     * 
     * @return array 
     */ 
     public function errors() 
     { 
       return $this->errors; 
     } 

} 

然後在我的應用\校驗我創建了一個文件名RegistrationFormValidator.php它看起來像這樣

<?php namespace App\Validators\Profile; 

class RegistrationFormValidator extends \Core\Validators\LaravelValidator 
{ 
    protected $rules = array(
     'first_name' => 'required', 
     'last_name'  => 'required', 
     'username'  => 'required', 
     'password'  => 'required', 
     'rTPassword' => 'required', 
     'profile_url' => 'required', 
     'email'   => 'required|email', 
     'gender'  => 'required', 
     'dob'   => 'required', 
    ); 
} 

所以平時在laravel 4.2,驗證所有的東西我做的是構建驗證規則,然後調用它的服務,像這樣

<?php namespace App\Services\Profile; 

    /* 
    |----------------------------------------------------------- 
    | This section injects the repositories being used 
    | in this service. 
    |----------------------------------------------------------- 
    */ 

    use App\Repositories\Profile\ProfileRepository; 
    use Core\ValidationFailedException; 
    use App\Validators\Profile\RegistrationFormValidator; 
    use Validator; 

class ProfileService implements ProfileServiceInterface 
{ 
    protected $_profile; 
    protected $v; 

    /* 
    |----------------------------------------------------------- 
    | All construsted models variables must carry 
    | the '_' sign to identify it as a model variable 
    |----------------------------------------------------------- 
    */ 

    public function __construct(ProfileRepository $_profile, RegistrationFormValidator $v) 
    { 
     $this->_profile = $_profile; 
     $this->v = $v; 
    } 

    /* 
    |----------------------------------------------------------- 
    | 1. All try and catch error handling must be done 
    |  in the respective controllers. 
    | 
    | 2. All data formattings must be done in this section 
    |  then pass to repository for storing. 
    | 
    | 3. No controller actions allown in this section 
    |----------------------------------------------------------- 
    */ 

    public function createProfile($array) 
    { 

     if($this->v->passes()) 
     { 
      //save into db 
     } 
     else 
     { 
      throw new ValidationFailedException(
        'Validation Fail', 
        null, 
        $this->v->errors() 
        ); 
     } 
    } 
} 

但問題是,一旦我升級成laravel 5我做同樣的事情當我嘗試用這個錯誤

ErrorException in ProfileService.php line 26: 
Argument 2 passed to App\Services\Profile\ProfileService::__construct() must be an instance of App\Validators\Profile\RegistrationFormValidator, none given 

我的代碼在L4.2精絕執行它返回我的代碼,但一旦我升級它不會工作了。我也知道我能做到像這樣

public function createProfile($array) 
{ 
    $v = Validator::make($array, [ 
     'first_name' => 'required', 
     'last_name'  => 'required', 
     'username'  => 'required', 
     'password'  => 'required', 
     'rTPassword' => 'required', 
     'profile_url' => 'required', 
     'email'   => 'required|email', 
     'gender'  => 'required', 
     'dob'   => 'required', 
    ]); 

    if($v->passes()) 
    { 

    } 
    else 
    { 
     throw new ValidationFailedException(
       'Validation Fail', 
       null, 
       $v->errors() 
     ); 
    } 
} 

驗證但問題是,如果我將有更多的驗證規則或場景就會淹沒整個服務文件。

任何意見或解決方案,將指導我?提前致謝!

+0

http://stackoverflow.com/questions/42068321/type-error-argument-2-passed-to-app-addphototoproduct-construct-must-be-an請幫我解決它。 –

回答

2

在Laravel 5中,您有類似的東西,它可以更好地驗證並使驗證更加簡潔。它被稱爲Form Request Validation。這裏的想法是一樣的 - 有不同的類在不同的場景中處理驗證。

所以每當你需要驗證您可以創建新FormRequest,就像這樣:

php artisan make:request RegisterFormRequest 

一個新的類將app/Http/Requests下產生。在那裏你可以看到它有兩種方法authorizerules。在第一個中,如果給定的用戶可以提出這個請求,你可以進行檢查。在第二種方法中,您可以像驗證器中那樣定義您的規則。

public functions rules() { 
    return array(
     'first_name' => 'required', 
     'last_name'  => 'required', 
     'username'  => 'required', 
     'password'  => 'required', 
     'rTPassword' => 'required', 
     'profile_url' => 'required', 
     'email'   => 'required|email', 
     'gender'  => 'required', 
     'dob'   => 'required', 
    ); 
} 

然後你就可以改變你的控制器的方法是這樣的:

public function postCreateProfile(RegisterFormRequest $request) { 
    // your code here 
} 

的是一些很酷的東西在這裏。第一個 - 該類將通過IoC容器注入到控制器方法中自動構建,您不需要做特別的事情。第二件很酷的事情是驗證檢查是在Request對象傳遞給控制器​​之前完成的,所以如果發生任何驗證錯誤,您將根據您的規則集重定向到所有錯誤。這意味着如果這個代碼被執行,你可以假設在postCreateProfile方法中編寫你的代碼,驗證通過這個位置,你不需要額外的檢查。

我建議你遷移你的代碼以使用Laravel 5 Form Requests,因爲你需要的東西已經在框架中實現了,是的,基本上這是一個版本遷移到另一個版本的要點。您還可以查看documentation以獲取更多示例。