2

我正在尝试覆盖doReplacements. Illuminate\Validation\Validator当我扩展本机ValidatorRequest类时,出现此错误:

Route.php 第 270 行中的 ReflectionException:

类 App\Http\Requests\FooRequest 不存在

这就是我所做的:

  1. 扩展原生Illuminate\Validation\Validator

    class MyCustomValidator extends Validator {
    
        protected function doReplacements($message, $attribute, $rule, $parameters) {
            //override this method
        }
    
    }
    
  2. MyCustomValidator在 native 的抽象扩展中使用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
    }
    


我猜我缺少必需的外观、提供程序或容器绑定。我仍在学习这些主题,并且对它们的理解还不够好,无法知道下一步。

参考:

  • Laravel 5 中的自定义验证器- 我遵循了答案,但仍然遇到同样的错误。在排除我在这里尝试的问题之前,我想知道这是否与我的问题远程相关。

  • 扩展自定义验证类- 问题看起来很相似,答案建议使用Validator::extend,我知道可以在 中完成AppServiceProvider,但理想情况下我的代码应该在它自己的供应商包中。同样,不确定是否相关。

4

2 回答 2

2

我有同样的问题,这就是我所做的。

首先,创建一个类并将其命名为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);
    }
}

最后,我们应该在 providers 数组下添加我们在config/app.php 中创建的服务提供者。

App\Providers\CustomValidatorServiceProvider::class,

您已经可以删除或注释掉ValidationServiceProvider

Illuminate\Validation\ValidationServiceProvider::class,
于 2017-09-19T03:26:15.627 回答
-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;
于 2016-04-03T18:19:53.820 回答