0%

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

问题

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

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

1
<?php
2
3
namespace Illuminate\Foundation\Http\Middleware;
4
5
class ConvertEmptyStringsToNull extends TransformsRequest
6
{
7
    /**
8
     * Transform the given value.
9
     *
10
     * @param  string  $key
11
     * @param  mixed  $value
12
     * @return mixed
13
     */
14
    protected function transform($key, $value)
15
    {
16
        return is_string($value) && $value === '' ? null : $value;
17
    }
18
}

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

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

方法1

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

1
// app/Http/Middleware/NinjaAuther.php 新增文件
2
3
namespace App\Http\Middleware;
4
5
class NinjaAuther extends TransformsRequest
6
{
7
8
/**
9
 * Transform the given value.
10
 *
11
 * @param  string  $key
12
 * @param  mixed  $value
13
 * @return mixed
14
 */
15
protected function transform($key, $value)
16
{
17
        if(is_string($value) && !in_array($key,  ['abc'], true)) {
18
            $value = $value === '' ? null : $value;
19
        }
20
21
    return $value;
22
    }
23
}
1
// app/Http/Kernel.php 部分代码
2
3
protected $middleware = [
4
        \App\Http\Middleware\CheckForMaintenanceMode::class,
5
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
6
        \App\Http\Middleware\TrimStrings::class,
7
        // \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, // 这一条注释掉
8
        \app/Http/Middleware/NinjaAuther.class, // 新增的记录
9
        \App\Http\Middleware\TrustProxies::class,
10
    ];

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

1
// app/Http/Controllers/StoreController.php
2
3
<?php
4
5
namespace App\Http\Controllers;
6
7
use App\Store;
8
use Illuminate\Http\Request;
9
10
class StoreController extends Controller
11
{
12
    public function save(Request $request) {
13
        $store = new Store();
14
        $store->title = strval($request->input("title")); // 对获取的字段进行格式转换
15
        $store->address = strval($request->input("address"));
16
        $store->longitude = doubleval($request->input("longitude"));
17
        $store->latitude = doubleval($request->input("latitude"));
18
        $store->introduction = strval($request->input("introduction"));
19
        $store->text = strval($request->input("text"));
20
        $store->status = intval($request->input("status"));
21
        $store->save();
22
    }
23
}

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

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

参考