2015-05-25 104 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以获取更多示例。