Laravel 5 __construct() ошибка передачи аргумента

Поэтому я пытаюсь сгруппировать все свои правила проверки в соответствующие файлы в папках для удобства обслуживания. Ниже показано, как выглядят мои структуры папок:

Project
--app
--config
--(more folders)
--domains
----App
--------Entities
--------Repositories
--------Services
--------Validators
----Core
--------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()
        );
    }
}

Но проблема в том, что если бы у меня было больше правил или сценариев проверки, это затопило бы весь файл службы.

Любые предложения или решения, которые помогут мне? заранее спасибо!


person Kenny Yap    schedule 25.05.2015    source источник
comment
stackoverflow.com/questions/42068321/, пожалуйста, помогите мне решить ее.   -  person julee dadhaniya    schedule 06.02.2017


Ответы (1)


В Laravel 5 у вас есть что-то похожее, которое лучше обрабатывает проверку и делает проверку чистой и легкой. Это называется Проверка запроса формы. Идея там та же — иметь разные классы, обрабатывающие валидацию в разных сценариях.

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

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, вам не нужно делать что-то особенное. Вторая интересная вещь заключается в том, что проверка проверки выполняется до того, как объект запроса будет передан контроллеру, поэтому, если произойдет какая-либо ошибка проверки, вы будете перенаправлены обратно со всеми ошибками в соответствии с вашими правилами. Это означает, что, написав свой код в методе postCreateProfile, вы можете предположить, что если этот код будет выполнен, проверка будет пройдена в этой позиции, и вам не потребуется дополнительная проверка.

Я предлагаю вам перенести свой код на использование Laravel 5 Form Requests, потому что то, что вам нужно, уже реализовано во фреймворке, и да, в основном это точка миграции одной версии на другую. Дополнительные примеры также можно найти в документации.

person Sh1d0w    schedule 25.05.2015