前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >laravel中表单提交获取字段会将空值转换为null的解决方案

laravel中表单提交获取字段会将空值转换为null的解决方案

作者头像
魔王卷子
发布2019-05-30 20:37:53
3.6K0
发布2019-05-30 20:37:53
举报

问题

今天在进行Laravel开发的时候,发现了比较坑的一点。 按照默认情况来说,比如表单提交,如果我们提交了这个字段,但是这个字段为空字符串。在Laravel中会自动转义成Null。这个为什么呢?

原来Laravel有个全局中间件,代码如下图:

代码语言:javascript
复制
<?php

namespace Illuminate\Foundation\Http\Middleware;

class ConvertEmptyStringsToNull extends TransformsRequest
{
    /**
     * Transform the given value.
     *
     * @param  string  $key
     * @param  mixed  $value
     * @return mixed
     */
    protected function transform($key, $value)
    {
        return is_string($value) && $value === '' ? null : $value;
    }
}

该中间件就会将空的参数值自动转为null。

那么对于这种问题应该如何解决呢?

方法1

我们再写一个中间件,替换之前的中间件,里面可以排除指定字段不转为null。里面的数组可以更改成你需要不转的字段。

代码语言:javascript
复制
// app/Http/Middleware/NinjaAuther.php 新增文件

namespace App\Http\Middleware;

class NinjaAuther extends TransformsRequest
{

/**
 * Transform the given value.
 *
 * @param  string  $key
 * @param  mixed  $value
 * @return mixed
 */
protected function transform($key, $value)
{
        if(is_string($value) && !in_array($key,  ['abc'], true)) {
            $value = $value === '' ? null : $value;
        }

    return $value;
    }
}
代码语言:javascript
复制
// app/Http/Kernel.php 部分代码

protected $middleware = [
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        // \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, // 这一条注释掉
        \app/Http/Middleware/NinjaAuther.class, // 新增的记录
        \App\Http\Middleware\TrustProxies::class,
    ];

但是该中间件是全句性质的,所以我个人则更加倾向于第二种方法。

代码语言:javascript
复制
// app/Http/Controllers/StoreController.php

<?php

namespace App\Http\Controllers;

use App\Store;
use Illuminate\Http\Request;

class StoreController extends Controller
{
    public function save(Request $request) {
        $store = new Store();
        $store->title = strval($request->input("title")); // 对获取的字段进行格式转换
        $store->address = strval($request->input("address"));
        $store->longitude = doubleval($request->input("longitude"));
        $store->latitude = doubleval($request->input("latitude"));
        $store->introduction = strval($request->input("introduction"));
        $store->text = strval($request->input("text"));
        $store->status = intval($request->input("status"));
        $store->save();
    }
}

如上面这样,对指定格式进行显示转换。写的多了,可能会显得繁琐一些。不过感觉比较看的明白。

上面这种方案如何解决,就看大家的喜好了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-09-082,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 方法1
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档