laravel中的自定义验证规则

时间:2015-04-19 11:36:38

标签: php laravel-4

我正在尝试为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();
    }

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

1 个答案:

答案 0 :(得分:1)

  

事实证明我需要将我的验证扩展注册到IoC容器。不知道如何在不使用文档中的外墙的情况下以干净的方式做到这一点

这类事情最好的地方是Service Provider。您可以使用现有的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']访问它。

最后一点,考虑将Show重命名为更具表现力的内容,例如ShowValidator

更新

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

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

您也可以在服务提供商或全球范围内执行此操作,但这意味着可以随处使用,我感觉您不希望这样。