Justin's Words

Laravel Custom Validator

laravel Validation rules 不够用时你就需要进行自定义 validation rule

Validator::extend()

最直接的是通过 Validation::extend() 来创建自定义验证规则,你可以在 app/routes.php 或控制器来写:

1
2
3
4
Validator::extend('foo', function($attribute, $value, $parameters)
{
return $value == 'foo';
});

$attribute 为要验证的属性名称,$value 为属性的值,$parameters 为传递到规则的参数数组。

以下是一个验证是否唯一的自定义验证规则:

1
2
3
4
5
6
7
Validator::extend('isUniqueIn', function ($attribute, $value, $parameters) {
$table = $parameters[0];
$field = $parameters[1];
$matches = DB::table($table)->where($field, $value)->count();

return $matches == 0;
});

Usage

1
2
3
$rules = array(
'username' => 'isUniqueIn:users, username',
);

接受两个参数,第一为表名,第二为列名。

Illuminate\Validation\Validator

通过扩展 Illuminate\Validation\Validator 增加全局验证方法。

app/validators 创建 customValidator.php官方模板

1
2
3
4
5
6
class CustomValidator extends Illuminate\Validation\Validator {
public function validateFoo($attribute, $value, $parameters)
{
return $value == 'foo';
}
}

我的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// app/validators/customValidation.php

namespace App\Service\Validators;

use Illuminate\Validation\Validator as IlluminateValidator;

class customValidation extends IlluminateValidator
{
public function validateisUniqueIn($attribute, $value, $parameters) {
$table = $parameters[0];
$field = $parameters[1];
$matches = DB::table($table)->where($field, $value)->count();

return $matches == 0;
}
}

然后拓展自定义验证器在 app/start/global.php

1
2
3
4
Validator::resolver(function($translator, $data, $rules, $messages)
{
return new \App\Service\Validators($translator, $data, $rules, $messages);
});