Laravel本身内置了许多好用的数据校验规则,拿来即用,但这远远不够,我们需要自定义自己的验证规则是必要的。
简单验证
配置
App\Providers\AppServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Validators\Validation;
use Illuminate\Support\Facades\Validator;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Validator::resolver(function ($translator, $data, $rules, $messages) {
return new Validation($translator, $data, $rules, $messages);
});
}
}
自定义验证的类添加
App\Validators\Validation.php
<?php
namespace App\Validators;
use App\Validators\Demo\DemoValidation;
use Illuminate\Validation\Validator;
class Validation extends Validator
{
/**
* 自定义校验:Demo
*/
use DemoValidation;
}
App\Validators\DemoValidation.php
请注意验证的命名方式,必须validate{Name}, 如validateDemoTest
<?php
namespace App\Validators\Demo;
trait DemoValidation
{
public function validateDemoTest($attribute, $value, $parameters)
{
if ($value == 'test') {
return false;
}
return true;
}
}
验证名称的中文配置
resource\lang\zh-CN\validation.php
'demo_test' => ':attribute 测试验证'
自定义验证的使用
自定义验证使用方式和我们普通的验证一样的,只需要在验证规则里面加上我们自定义的即可,
使用名称如validateDemoTest,只需要填写demo_test即可。
<?php
namespace App\Validators\Home;
use Prettus\Validator\LaravelValidator;
class LockValidator extends LaravelValidator
{
const RULE_DEMO_TEST = 'demo_test';
protected $rules = [
self::RULE_DEMO_TEST => [
'A' => 'required|integer|demo_test',
'B' => 'integer',
]
];
protected $messages = [
];
protected $attributes = [
];
}
复杂验证
除了上面所说的简单自定义验证之外,我们可能还需要验证多个字段的有效性,或是在验证里面调用我们的业务方法等等...
我们可以$this->getValue('B'),得到其他参数的值,从而进行更复杂的校验,下面的示例主要介绍几点:
- 获取其他字段的值 (重点),$this->getValue('community_unit_id')
- 参数的传递及接收
- 自定义验证提示 $this->setCustomMessages(['demo_test' => 'A规则不符合']);
- 其他可以自行查看所有可用的方法
<?php
namespace App\Validators\Demo;
use App\Servers\DemoServer;
trait DemoValidation
{
public function validateDemoTest($attribute, $value, $parameters)
{
$A = $value;
//得到其他参数的值
$condition['B'] = $this->getValue('B');
//参数的传递方式:required|demo_test:111,222 多个参数用逗号分割,参数的获取如下:
$paramB = $parameters[0];
//调用Server层进行业务上的校验。
DemoServer::hasXxx($condition);
//复杂校验可设置对应的提示
if ($value != 'A') {
$this->setCustomMessages(['demo_test' => 'A规则不符合']);
return false;
}
if ($value != 'B') {
$this->setCustomMessages(['demo_test' => 'B规则不符合']);
return false;
}
return true;
}
}