繁体   English   中英

Laravel中的自定义验证规则

[英]Custom validation rule in laravel

我正在尝试为laravel创建自定义验证规则,但始终出现以下错误: Method [validateOriginalAlt] does not exist.

我有2节课。

FormValidator.php

abstract class FormValidator extends Validator
{

    protected $validator;
    protected $validation;
    protected $messages = [];
    protected $rules = [];

    function __construct(Validator $validator)
    {
        $this->validator = $validator;
    }


    public function validate(array $formData)
    {
        $this->validation = $this->validator->make($formData, $this->getValidationRules(), $this->getValidationMessages());

        if ($this->validation->fails()) {
            throw new FormValidationException('Validation Failed', $this->getValidationErrors());
        }

        return true;
    }

    public function setRules($rules)
    {
        $this->rules = $rules;
        return $this;
    }

    protected function getValidationRules()
    {
        return $this->rules;
    }

    protected function getValidationMessages()
    {
        return $this->messages;
    }

    protected function getValidationErrors()
    {
        return $this->validation->errors();
    }
}

Show.php

class Show extends FormValidator
{

    protected $rules = [
        'title' => 'required|unique:shows,title',
        'slug' => 'unique:shows,slug',
        'flexget' => 'boolean',
        'airing' => 'boolean',
        'flexget_titles' => 'original_alt',
    ];


    public function validateOriginalAlt($string)
    {
        dd($string);
    }
}

在我的控制器中,我像这样调用验证方法:

    try {
        $this->showValidator->setRules([
            'title' => 'required',
            'slug' => 'unique:shows,slug,' . $id,
            'flexget_titles' => 'original_alt',
        ])->validate($data);
    } catch (Animekyun\Forms\FormValidationException $e) {
        return Redirect::back()->withErrors($e->getErrors())->withInput();
    }

关于我可能做错了什么的任何想法?

事实证明,我需要将验证扩展注册到IoC容器。 不知道如何在不使用文档的外观的情况下以干净的方式进行操作

最好的地方是服务提供商 您可以使用现有的App\\Providers\\AppServiceProvider或创建一个新的(例如ValidatorServiceProvider

无论如何,然后应在提供程序的boot()方法中注册验证器:

public function boot()
{
    $this->app['validator']->resolver(function($translator, $data, $rules, $messages)
    {
        return new Show($translator, $data, $rules, $messages);
    });
}

如您所见,它与文档中的Facade示例几乎相同。 这是因为Facade只是基础类的访问app['validator'] ,可以使用app['validator']进行访问。

最后一件事,考虑将Show重命名为更具表现力的名称,例如ShowValidator

更新

对于您的情况,我建议这样的事情:

class Show extends FormValidator {
    public function __construct(Validator $validator){
        $validator->extend('original_alt', 'Show@validateOriginalAlt');
        parent::__construct($validator);
    }
}

您也可以在服务提供商中或全球范围内进行此操作,但这意味着该功能随处可见,我感到您不希望这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM