Php laravel中的自定义验证规则

Php laravel中的自定义验证规则,php,laravel-4,Php,Laravel 4,我正在尝试为laravel创建自定义验证规则,但不断出现以下错误: 方法[validateOriginalAlt]不存在。 我有两门课 FormValidator.php abstract class FormValidator extends Validator { protected $validator; protected $validation; protected $messages = []; protected $rules = [];

我正在尝试为laravel创建自定义验证规则,但不断出现以下错误:
方法[validateOriginalAlt]不存在。

我有两门课

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容器。不知道如何做到这一点,在一个干净的方式,而不使用像在docu的外观

做这些事情最好的地方是一个公园。您可以使用现有的
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']
访问它

最后一件事,考虑重命名<代码> Sudio,如“代码>显示验证程序< /代码> .< /P>。 更新 对于你的情况,我建议如下:

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

您也可以在服务提供商或全球范围内这样做,但这意味着它在任何地方都可用,我感觉您不希望这样做。

事实证明,我需要将我的验证扩展注册到IoC容器中。我不知道如何在不使用docuth中的外观的情况下以干净的方式实现这一点。我现在面临的问题是,当
Show
validator被实例化时,会传递4个参数。我的
FormValidator
构造函数只接受
验证器的
工厂
类。你的最后一个建议很好,我已经在重构过程中了!谢谢嗯,我明白了。你到底在扩展什么
Validator
类?我个人只在文档中这样做过(扩展
illumb\Validation\Validator
),因此继承了带有这些参数的构造函数……我遵循了Jeffrey Way关于表单验证的教程,正在扩展
illumb\Validation\Factory
。这样做的原因是,这样我就可以创建验证器,并传入我的规则和消息。这确实是一个问题![我必须添加更多文本,否则我无法发表评论]问题是,
$this->validator
仍然是默认的
validator
类,而不是使用
validateOriginalAlt()
方法的自定义类。你能给我那个教程的链接吗?