【Laravel】空文字がnull値になる理由!ConvertEmptyStringsToNullとは?
この記事からわかること
- Laravelのデータベース格納時のエラー
- 空文字がnull値になる原因
- 自動実行されるミドルウェアの解除方法
- ConvertEmptyStringsToNullとTrimStringsの意味
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Laravelでフォーム機能を使ってリクエストを送信しデータベースに値を格納する際、空文字("")が勝手にnull値
に変換されエラーが発生してしまいました。
その原因と解決方法をまとめていきたいと思います。
リクエスト送信の空文字がnull値になる原因
原因:空文字をnull値に変換するミドルウェアが自動実行されていたから
Laravelではバージョン5.4から「空文字が自動でnull値に変換してくれる」ConvertEmptyStringsToNullというミドルウェアがONになっています。
なのでフォーム要素から値を送信する時に空文字(未入力)だとリクエスト情報のinputの値にはnull
として格納されます。
TestController.php
public function form(Request $request){
// is_null関数=値がnullならtrueを返す
if(is_null($request->input('name'))){
// 未入力の場合こちらが実行される
dd($request->input('name')); // 結果:null
}else{
// 入力値があればこちらが実行される
dd($request->input('name')); // 結果:入力値
}
}
Laravelでは空文字をnullに変換するConvertEmptyStringsToNullだけでなく文字の空白をトリミングしてくれるTrimStringsというミドルウェアがグローバルミドルウェアとしてデフォルトで登録されています。
(グローバル)ミドルウェアとはリクエストが送られたタイミングで処理を自動実行してくれる機能のことです。今回はフォームに入力後POST(HTTPリクエスト)送信されたタイミングでコントローラに渡される前に入力値に対して変換処理が実行されていたようです。
解決法(グローバルミドルウェアの解除方法)
解決法1:グローバルミドルウェアを解除する
解決法2:データベースのカラムをnullableにする
自動実行されてしまうミドルウェアを登録しているのは「app」>「Http」>「Kernel.php」で管理されています。
「app」>「Http」>「Kernel.php」
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
protected $middleware = [
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
「Kernel.php」の中の$middleware
配列の中にTrimStrings
とConvertEmptyStringsToNull
が定義されています。
解除するのは簡単でミドルウェアをコメントアウトすれば自動実行されなくなります。これで空文字を送信してもnull
へ変更されず空文字としてデータベースに登録することができます。
データベースのカラムをnullableにする
またミドルウェアをコメントアウトして解除しなくてもデータベースのカラム設定をnullable
(null値を許可)にすればエラーは発生しなくなります。
マイグレーションファイルの場合はnullable
メソッドを実行すればOKです。
日付_create_テーブル名_table.php
public function up()
{
Schema::create('customer', function (Blueprint $table) {
$table->increments('id');
$table->string('name',15);
$table->integer('age')->nullable();
$table->timestamps();
});
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。