我正在尝试为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();
}
关于我可能做错的任何想法?
答案 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);
}
}
您也可以在服务提供商或全球范围内执行此操作,但这意味着可以随处使用,我感觉您不希望这样。