[英]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.