Laravel で作った API に空文字を渡すと API 側でエラーが発生するという事象にあいました。
調査してみると、どうやら API に渡した空文字が Laravel 側で null に変換され、その後の処理で意図せず null 参照が発生してエラーとなっているようでした。
空文字を null にするというのは Laravel のデフォルトの挙動です。
https://readouble.com/laravel/9.x/ja/requests.html より抜粋
リクエストに応じてすべての受信文字列フィールドを自動的にトリミングし、空の文字列フィールドを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.php
の ConvertEmptyStringsToNull
部分を削除(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,
];
本件についてググると沢山の記事がヒットします。皆さん困っているようです。