请求参数传null,默认值无效问题

平时有如下写法:

$type = $request->input('type', 2);

没值的时候,想有个默认值,但只有前端不传type字段,才有默认值,如果前端传了type=null,那么这个默认值2是不生效的,得到的typenull

所以我每次默认值不得不采用如下写法:

$type = $request->input('type') ?? 2;

请问大家有更优雅的处理方法吗?

补充一点:自家前端使用的场景下,可以要求前端没值就不传该字段没错。但我经常对接第三方API,第三方API回调传数据的时候,一个字段没有值,他们就是传null的,挺多公司的API都是这个情况,所以有时候同事问我,->input()第二个参数可以设置默认值啊,你为什么不用,我又解释一遍为什么,挺尴尬的,就想问问大家有没有更优雅的处理方法,比如在laravel框架某个地方统一设置一下。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 8

自己写一个方法呗,省事儿

2年前 评论

只能自己再包装一层

2年前 评论
// 你想要把
$type = $request->input('type') ?? 2;

//写成
$type = $request->input('type', 2);

你只是为了值为null的时候用默认值,?? 为什么不行你觉得不优雅什么的。两个方法都要写默认值 你重新定义一个方法就不用传默认值?请不要优雅过头了

2年前 评论

@4pmzzzzzzzzzz 别人看到总会感到奇怪,问input支持默认值啊,你为什么写外面去,情况就是这么个情况

2年前 评论

@忆往昔弹指间 你非要自己封装一个的话
AppServiceProviderboot方法

use Illuminate\Http\Request;
// 自己写一个
Request::macro();

不是支持默认值 你看下源码,不是不存在或者为null是返回默认,是不存在才返回默认值。

if (Arr::accessible($target) && Arr::exists($target, $segment)) {
                $target = $target[$segment];
            } elseif (is_object($target) && isset($target->{$segment})) {
                $target = $target->{$segment};
            } else {
                return value($default);
            }
2年前 评论
  // 感觉还不如你写的简洁,可以给你提供参考 
  $type = $request->filled('type') ? $request->input('type') : 2
2年前 评论

@4pmzzzzzzzzzz 源码那里我知道,其实关于null应认定为有值还是无值,在社区一直是有争议的,我个人是站在认定为无值那一派的,像env()、config(),也是认为null是无值的,我认为应该统一

2年前 评论
yema

你写的已经蛮优雅的了

2年前 评论

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