在laravel 5.5之后,您可以创建自己的自定义验证规则对象。
要创建新规则,只需运行Artisan命令:
php artisan make:rule Id
laravel将把新的rule类放在app/Rules
目录中
自定义对象验证规则的示例可能类似于:
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class Id implements Rule
{
private $message;
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
*
* @return bool
*/
public function passes($attribute, $value)
{
if(!$this->isValidCard($value)){
$this->message = '身份证格式错误,请输入正确的身份证.';
return false;
}
return true;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return $this->message;
}
/**
* 身份证验证
* @param $id
* @return bool
*/
private function isValidCard($id) {
if(18 != strlen($id)) {
return false;
}
$weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
$code = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
$mode = 0;
$ver = substr($id, -1);
if($ver == 'x') {
$ver = 'X';
}
foreach($weight as $key => $val) {
if($key == 17) {
continue;
}
$digit = intval(substr($id, $key, 1));
$mode += $digit * $val;
}
$mode %= 11;
if($ver != $code[$mode]) {
return false;
}
list($month, $day, $year) = self::getMDYFromCard($id);
$check = checkdate($month, $day, $year);
if(!$check) {
return false;
}
$today = date('Ymd');
$date = substr($id, 6, 8);
if($date >= $today) {
return false;
}
return true;
}
private function getMDYFromCard($id) {
$date = substr($id, 6, 8);
$year = substr($date, 0, 4);
$month = substr($date, 4, 2);
$day = substr($date, 6);
return [$month, $day, $year];
}
}
//在控制器里面引入:
$rules = [
'buyer_name' => ['regex:/^[\p{Han}|\w]{2,30}$/u'],
'buyer_id_number' => ['required', new Id],
'buyer_telephone' => 'required|unique:investor',
];