[Laravel] Request Input が空文字だった場合、null に変換されるミドルウェアを除外する

2018年12月23日ITLaravel, PHP

こんにちは、ハラダ(@nobuhiro_harada)です。

Laravel で Request Input が空文字だったら、空文字をそのままデータベースに書き込んで欲しかったのですが、null に変換されるので、model か controller で1項目ずつチェックせなあかんの?と、思って調べていたら、原因はデフォルトで入っているミドルウェア ConvertEmptyStringsToNull でした。

参考:
https://laravel.com/docs/5.5/requests#input-trimming-and-normalization

[検証環境]
PHP 7.2.4
MySQL 5.7.22
Laravel 5.5.40

修正箇所

確かに設定されていましたので、一旦コメントアウトしたら、空文字でリクエストしたら、空文字で受け取れました。

app/Http/Kernel.php

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        // \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\TrustProxies::class,
    ];

[省略]

グローバルミドルウェアで設定されているので、全リクエスト項目に対して、空文字だったら、null に変換されますね。

うまく使えば、model や controller で空文字チェックはしなくて済みそうです。

クラス ConvertEmptyStringsToNull は下記のような実装でした。

Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php

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;
    }
}

スポンサーリンク

Posted by nobuhiro harada