Laravel验证器自定义规则,实现Yii2的default验证器

如果你使用过Yii2这个框架 一定知道它的验证器中有一个默认值验证器

[
    // 若 "age" 为空,则将其设为 null
    ['age', 'default', 'value' => null],

    // 若 "country" 为空,则将其设为 "USA"
    ['country', 'default', 'value' => 'USA'],

    // 若 "from" 和 "to" 为空,则分别给他们分配自今天起,3 天后和 6 天后的日期。
    [['from', 'to'], 'default', 'value' => function ($model, $attribute) {
        return date('Y-m-d', strtotime($attribute === 'to' ? '+3 days''+6 days'));
    }],
]

Yii的验证器不仅支持验证,还支持各种过滤,比如empty、设置默认值default等十分方便。而在Laravel,我没有找到这些东西,如果你使用

$request->validate(...)
$type = $request->input('type', 'all');

这样的方式来获取数据这似乎不是什么问题

但字段足够多的时候,大量使用 $request->input(‘…’, ‘default’)会使得你的代码不够美观,所以我们经常使用validated来获取数据,而使用validated的数据就存在一个判断数据是否存在和设置默认值的问题,代码又会变得繁琐,所以一个default规则显得很有必要

//自定义验证器
Validator::extendImplicit('default',function ($attribute, $value, $parameters, $validator){

    //如果没有值则赋予默认值
    if( empty($value) ){
        $data = $validator->getData();
        $data[$attribute] = $parameters[0] ?? '';
        $validator->setData($data);
    }

    return true;
});

//快速验证
$validated = $request->validate([
     'name'     => 'max:50',
     'email'    => 'email',
     'group_id' => 'in:1,2,0|default:2',
]);

//抛弃这样的代码 
isset($validated['group_id']) ? $validated['group_id'] : 2 ;

//可以直接使用
$validated['group_id']
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!