10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravel で作った API に空文字を渡すと null になる

Posted at

Laravel で作った API に空文字を渡すと API 側でエラーが発生するという事象にあいました。

調査してみると、どうやら API に渡した空文字が Laravel 側で null に変換され、その後の処理で意図せず null 参照が発生してエラーとなっているようでした。

空文字を null にするというのは Laravel のデフォルトの挙動です。

https://readouble.com/laravel/9.x/ja/requests.html より抜粋
image.png

リクエストに応じてすべての受信文字列フィールドを自動的にトリミングし、空の文字列フィールドをnullに変換します。

なるほどです。 Git for Windows の autocrlf 級に、余計なお世話感がある仕様です(個人の感想です)。

この機能をOFFにする場合は、 https://readouble.com/laravel/9.x/ja/requests.html に記載してあるように skipWhen を使って局所的にOFFにする方法とミドルウェア自体をOFFにする方法があります。

局所的にOFFにする場合(https://readouble.com/laravel/9.x/ja/requests.html より抜粋し一部改変)

use Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull;

/**
 * 全アプリケーションサービスの初期起動処理
 *
 * @return void
 */
public function boot()
{
    ConvertEmptyStringsToNull::skipWhen(function ($request) {
        return $request->is('admin/*');
    });
}

ミドルウェアごとOFFにする場合
app/Http/Kernel.phpConvertEmptyStringsToNull 部分を削除(or コメントアウト)します。

    protected $middleware = [
        // \App\Http\Middleware\TrustHosts::class,
        \App\Http\Middleware\TrustProxies::class,
        \Illuminate\Http\Middleware\HandleCors::class,
        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        // コメントアウトしてミドルウェアごと OFF にする
        // \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

本件についてググると沢山の記事がヒットします。皆さん困っているようです。

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?