在替换器中访问验证失败的值?

时间:2014-08-02 21:35:27

标签: validation laravel

在Laravel中使用自定义验证规则和替代品时,我真的很难找到任何文档,只会让您获得验证失败的值。

例如,我创建了一个文件存在验证器:

Validator::extend('view_exists', function($field,$value,$parameters) 
{
    return View::exists($value);
});
Validator::replacer('view_exists', function($message, $attribute, $rule, $parameters)
{
    return str_replace(':filename', 'THE ENTERED VALUE', $message);
});

现在,当我创建一个规则:

$rules = array('filename' => 'required|view_exists');
$messages = array('filename.view_exists' => 'Filename \':filename\' does not exist');

当我输入无效路径时,例如safsakjhdsafkljh,我希望它可以返回

Filename 'safsakjhdsafkljh' does not exist

replacer无法访问验证失败的值。我已经尝试输出传递给闭包的所有参数,包括$this,并且它无处可见:(

在我使用Input::get(urgh)之前,我错过了一些完全明显的东西吗?

由于

加文

4 个答案:

答案 0 :(得分:3)

使用Laravel 5.4,您可以在替换器回调中访问Validator实例,如下所示:

LanguageSelectionTVC

答案 1 :(得分:2)

使用getValue()课程中的 Validator 方法。为此,请按照以下两个步骤操作:

第一

创建自己的CustomValidator类,扩展Laravel Illuminate\Validation\Validator基类:

Validator::resolver(function($translator, $data, $rules, $messages, $attributes)
{
    return new CustomValidator($translator, $data, $rules, $messages, $attributes);
});

服务提供商

public function boot()
{
    $this->app->validator->resolver(function($translator, $data, $rules, $messages, $attributes)
    {
        return new CustomValidator($translator, $data, $rules, $messages, $attributes);
    });
}

第二

使用替换方法在CustomValidator中创建app/Validation/CustomValidator.php类:

<?php namespace App\Validation;

use Illuminate\Validation\Validator;

class CustomValidator extends Validator {

    /**
     * Replace all place-holders for the view_exists rule.
     *
     * @param  string  $message
     * @param  string  $attribute
     * @param  string  $rule
     * @param  array   $parameters
     * @return string
     */
    protected function replaceViewExists($message, $attribute, $rule, $parameters)
    {
        return str_replace(':value', $this->getValue($attribute), $message);
    }

}

答案 2 :(得分:2)

你可以这样做(Laravel 5.2):

Validator::extend('my_custom_validation_rule', function($attribute, $value, $parameters, $validator) {

    $validator->addReplacer('my_custom_validation_rule', function ($message, $attribute, $rule, $parameters) use ($value) {
        return str_replace(':value', $value, $message);
    });

    return $value == 'foo';
});

在翻译文件中:

'my_custom_validation_rule' => ':value is not correct value.'

答案 3 :(得分:1)

我怀疑我最初的想法是唯一的方法,但如果有人能提出建议,我会很感激:

我的解决方案是:

Validator::extend('view_exists', function($field,$value,$parameters) 
{
    return View::exists($value);
});
Validator::replacer('view_exists', function($message, $attribute, $rule, $parameters)
{
    return str_replace(':filename', Input::get($attribute), $message);
});

不是最好的,但是嘿,它有效......