2015-05-25 11 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; 
     } 

} 

Тогда в моем App \ Validators Я создал имя файла 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-addphototopduct-construct-must-be-an, пожалуйста, помогите мне решить его. –

ответ

2

В Laravel 5 у вас есть что-то похожее, которое лучше проверяет и делает проверку чистой и легкой. Он называется Form Request Validation. Идея та же: иметь разные классы, которые обрабатывают валидацию в разных сценариях.

Поэтому, когда вам нужно подтверждение вы можете создать новый СформироватьЗапрос, как это:

php artisan make:request RegisterFormRequest 

Новый класс будет создан под app/Http/Requests. Там вы можете увидеть, что у него есть два метода: authorize и rules. В первом случае вы можете сделать чек, если данный пользователь должен выполнить этот запрос. Во втором методе вы можете определить свои правила, как в валидаторе.

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.