Я пытаюсь переопределить doReplacements
метод в Illuminate\Validation\Validator
, Когда я расширяю родную Validator
а также Request
классы, я получаю эту ошибку:
ReflectionException в строке Route.php 270:
Класс App \ Http \ Requests \ FooRequest не существует
Вот что я сделал:
Расширить родной Illuminate\Validation\Validator
:
class MyCustomValidator extends Validator {
protected function doReplacements($message, $attribute, $rule, $parameters) {
//override this method
}
}
использование 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();
}
}
простираться MyCustomRequest
с конкретным классом:
class FooRequest extends MyCustomRequest
{
public function authorize()
{
return true;
}public function rules()
{
return [
// rules go here
];
}
}
Использовать FooRequest
в методе контроллера:
public function store(FooRequest $request) {
//use the request and persist
}
Я предполагаю, что мне не хватает обязательной привязки фасада, провайдера или контейнера. Я все еще изучаю эти темы и не понимаю их достаточно хорошо, чтобы знать хороший следующий шаг.
Рекомендации:
Валидаторы нестандартные в Ларавел 5 —
Я последовал за ответом, но все еще получил ту же ошибку. Я хочу знать, если это хотя бы отдаленно связано с моей проблемой, прежде чем устранять неполадки, которые я пробовал здесь.
Расширение пользовательского класса проверки —
Проблема выглядит аналогично, ответ предлагает использовать Validator::extend
Я знаю, что это можно сделать в AppServiceProvider
, но в идеале мой код должен быть в своем пакете поставщика. Опять же, не уверен, если это уместно.
У меня была такая же проблема, и это то, что я сделал.
Сначала создайте класс и назовите его 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,
Что вы можете сделать, это добавить 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;