Laravel Validator(在Replacer中获取属性名称)

时间:2016-06-16 10:45:09

标签: php laravel laravel-5

我想问的问题是如何获取属性名称或使用自定义验证器显示属性名称。

    $validator = Validator::make($request->all(), $model->get_update_rules());
    $validator->setAttributeNames(["attribute_name" => "Beauty Name"]);

上面的代码是我用来创建验证器的代码 下面的代码是我用来创建自定义验证器的代码。

Validator::extend ( 'custom_validator', function ($attribute, $value, $parameters, $validator) {
        return false;
    } );
    Validator::replacer('custom_validator', function($message, $attribute, $rule, $parameters) {
        return str_replace(":other", $parameters[1], $message);
    });

$ parameters [1]给我一个attribute_name而不是Beauty Name。如何在自定义验证器中显示美容名称?

3 个答案:

答案 0 :(得分:1)

最后,我通过扩展Laravel提供的Validator来解决问题。

use Illuminate\Validation\Validator;
use Symfony\Component\Translation\TranslatorInterface;
use DB;
use Illuminate\Support\Facades\Input;
class CustomValidator extends Validator{
    public function __construct(TranslatorInterface $translator, array $data, array $rules, array $messages = [], array $customAttributes = [])
    {
        parent::__construct($translator, $data, $rules, $messages, $customAttributes);
    }

    protected function validateCustomValidator($attribute, $value, $parameters){
        return false;
    }

    protected function replaceCustomValidator($message, $attribute, $rule, $parameters){
        return str_replace(':other', $this->getAttribute($parameters[1]), $message);
    }
}

上面的代码用于创建CustomValidator,它扩展了Laravel提供的Validator。在您的服务提供商中,您必须添加以下代码来解析您的CustomValidator。

use Illuminate\Support\ServiceProvider;
use App\Validator\CustomValidator;
use Validator;
class ValidatorServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        Validator::resolver(function($translator, $data, $rules, $messages, $customAttributes)
        {
            return new CustomValidator($translator, $data, $rules, $messages, $customAttributes);
        });
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

请记住在config / app.php

中添加此行
    App\Providers\ValidatorServiceProvider::class

答案 1 :(得分:0)

假设您尝试在错误消息中显示Beauty Name,您可以执行以下操作:

Validator::replacer('custom_validator', function( $message, $attribute, $rule, $parameters ) {
  return str_replace( [':value'], $parameters, $message );
});

// Error message for failure
$messages = [ 'custom_validator' => ':attribute is :value' ];

// validate input
$validation = Validator::make( Input::all(), $rules, $messages );

答案 2 :(得分:0)

我'我们用自定义验证器类解决了这个问题。您可以用类似的行为替换验证中的内容。这个是在Laravel 5.3上,但我认为它适用于5.1甚至4。

<?php

namespace App\Validators;

use Illuminate\Validation\Validator;

/**
 * NumbersValidator
 *
 * @package App\Validators
 */
class NumbersValidator
{
    /**
     * @param array $attribute
     * @param int $value
     * @param array $parameters
     * @param Validator $validator
     * @return bool
     */
    public function validateDivisibleOn($attribute, $value, $parameters, Validator $validator)
    {
        $validator->addReplacer('divisible_on', function ($message, $attribute, $rule, $parameters) use ($validator) {
            return \str_replace(':other', $parameters[0], $message);
        });

        return ($value % array_shift($parameters) == 0);
    }
}