Laravel 5.2 — расширение класса Validator

Я пытаюсь переопределить doReplacements метод в Illuminate\Validation\Validator, Когда я расширяю родную Validator а также Request классы, я получаю эту ошибку:

ReflectionException в строке Route.php 270:

Класс App \ Http \ Requests \ FooRequest не существует

Вот что я сделал:

  1. Расширить родной Illuminate\Validation\Validator:

    class MyCustomValidator extends Validator {
    
    protected function doReplacements($message, $attribute, $rule, $parameters) {
    //override this method
    }
    
    }
    
  2. использование MyCustomValidator в абстрактном расширении родного App\Http\Requests\Request:

    abstract class MyCustomRequest extends Request {
    
    //Override native method by injecting the extending validator
    protected function formatErrors( MyCustomValidator $validator )
    {
    return $validator->getMessageBag()->toArray();
    }
    }
    
  3. простираться MyCustomRequest с конкретным классом:

    class FooRequest extends MyCustomRequest
    {
    
    public function authorize()
    {
    return true;
    }public function rules()
    {
    return [
    // rules go here
    ];
    }
    }
    
  4. Использовать FooRequest в методе контроллера:

    public function store(FooRequest $request) {
    //use the request and persist
    }
    

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

Рекомендации:

  • Валидаторы нестандартные в Ларавел 5
    Я последовал за ответом, но все еще получил ту же ошибку. Я хочу знать, если это хотя бы отдаленно связано с моей проблемой, прежде чем устранять неполадки, которые я пробовал здесь.

  • Расширение пользовательского класса проверки
    Проблема выглядит аналогично, ответ предлагает использовать Validator::extendЯ знаю, что это можно сделать в AppServiceProvider, но в идеале мой код должен быть в своем пакете поставщика. Опять же, не уверен, если это уместно.

1

Решение

У меня была такая же проблема, и это то, что я сделал.

Сначала создайте класс и назовите его CustomValidatorServiceProvider или что угодно. внутри CustomValidatorServiceProvider добавьте следующие строки.

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Event;
use Illuminate\Validation\ValidationServiceProvider as ServiceProvider;
use App\Services\Validator\Factory;

class CustomValidatorServiceProvider extends ServiceProvider
{

/**
* Register the validation factory.
*
* @return void
*/
protected function registerValidationFactory()
{
$this->app->singleton('validator', function ($app) {
$validator = new Factory($app['translator'], $app);

// The validation presence verifier is responsible for determining the existence
// of values in a given data collection, typically a relational database or
// other persistent data stores. And it is used to check for uniqueness.
if (isset($app['db']) && isset($app['validation.presence'])) {
$validator->setPresenceVerifier($app['validation.presence']);
}

return $validator;
});
}

}

Если вы заметите, я добавил свой собственный Validator \ Factory и импортировал это.
Внутри Validator \ Factory У меня есть следующие коды.

<?php

namespace App\Services\Validator;

use Illuminate\Validation\Factory as ParentFactory;

class Factory extends ParentFactory
{

/**
* Resolve a new Validator instance.
*
* @param  array  $data
* @param  array  $rules
* @param  array  $messages
* @param  array  $customAttributes
* @return \Illuminate\Validation\Validator
*/
protected function resolve(array $data, array $rules, array $messages, array $customAttributes)
{
if (is_null($this->resolver)) {
return new Validator($this->translator, $data, $rules, $messages, $customAttributes);
}

return call_user_func($this->resolver, $this->translator, $data, $rules, $messages, $customAttributes);
}
}

Внутри того же каталога, где Validator \ Factory проживает, я добавил также мой обычай Класс валидатора который будет классом, который расширяет Класс валидатора рамок. Он содержит следующие коды.

<?php

namespace App\Services\Validator;

use Illuminate\Validation\Validator as ParentValidator;
use Illuminate\Support\Str;

class Validator extends ParentValidator
{

/**
* Replace all place-holders for the greater_than_equal rule.
*
* @param  string  $message
* @param  string  $attribute
* @param  string  $rule
* @param  array   $parameters
* @return string
*/
protected function replaceGreaterThanEqual($message, $attribute, $rule, $parameters)
{
$replacers[0] = str_replace('_', ' ', Str::snake($parameters[0]));
$replacers[1] = $attribute;
return str_replace([':other', ':attribute'], $replacers, $message);
}

/**
* Replace all place-holders for the after_or_equal rule.
*
* @param  string  $message
* @param  string  $attribute
* @param  string  $rule
* @param  array   $parameters
* @return string
*/
protected function replaceAfterOrEqual($message, $attribute, $rule, $parameters)
{
return $this->replaceGreaterThanEqual($message, $attribute, $rule, $parameters);
}
}

И, наконец, мы должны добавить Поставщик услуг что мы создали в конфиг / app.php под массивом провайдеров.

App\Providers\CustomValidatorServiceProvider::class,

И вы уже можете удалить или закомментировать ValidationServiceProvider

Illuminate\Validation\ValidationServiceProvider::class,
1

Другие решения

Что вы можете сделать, это добавить validator править в вашем Request Класс, например, таким образом:

public function validator(\Illuminate\Contracts\Validation\Factory $factory)
{
$this->addExtraRules($factory);

return $factory->make(
$this->all(), $this->container->call([$this, 'rules']),
$this->messages(), $this->attributes()
);
}

и теперь вам нужно реализовать addExtraRules метод например:

protected function addExtraRules(\Illuminate\Contracts\Validation\Factory $validator)
{
$validator->extendImplicit('equals_2',
function ($attribute, $value, $parameters, $validator) {
return $value == 2;
});
}

И об этом ошибки: App\Http\Requests\FooRequestубедитесь, что вы определили пространство имен в FooRequest файл класса таким образом:

namespace App\Http\Requests;
-1

По вопросам рекламы [email protected]