【Laravel】空文字がnull値になる理由!ConvertEmptyStringsToNullとは?

この記事からわかること
- Laravelのデータベース格納時のエラー
- 空文字がnull値になる原因
- 自動実行されるミドルウェアの解除方法
- ConvertEmptyStringsToNullとTrimStringsの意味
\ アプリをリリースしました /
Laravelでフォーム機能を使ってリクエストを送信しデータベースに値を格納する際、空文字("")が勝手にnull値
に変換されエラーが発生してしまいました。
その原因と解決方法をまとめていきたいと思います。
リクエスト送信の空文字がnull値になる原因
原因:空文字をnull値に変換するミドルウェアが自動実行されていたから
Laravelではバージョン5.4から「空文字が自動でnull値に変換してくれる」ConvertEmptyStringsToNullというミドルウェアがONになっています。
なのでフォーム要素から値を送信する時に空文字(未入力)だとリクエスト情報のinputの値にはnull
として格納されます。
TestController.php
Laravelでは空文字をnullに変換するConvertEmptyStringsToNullだけでなく文字の空白をトリミングしてくれるTrimStringsというミドルウェアがグローバルミドルウェアとしてデフォルトで登録されています。
(グローバル)ミドルウェアとはリクエストが送られたタイミングで処理を自動実行してくれる機能のことです。今回はフォームに入力後POST(HTTPリクエスト)送信されたタイミングでコントローラに渡される前に入力値に対して変換処理が実行されていたようです。
解決法(グローバルミドルウェアの解除方法)
解決法1:グローバルミドルウェアを解除する
解決法2:データベースのカラムをnullableにする
自動実行されてしまうミドルウェアを登録しているのは「app」>「Http」>「Kernel.php」で管理されています。
「app」>「Http」>「Kernel.php」
「Kernel.php」の中の$middleware
配列の中にTrimStrings
とConvertEmptyStringsToNull
が定義されています。
解除するのは簡単でミドルウェアをコメントアウトすれば自動実行されなくなります。これで空文字を送信してもnull
へ変更されず空文字としてデータベースに登録することができます。
データベースのカラムをnullableにする
またミドルウェアをコメントアウトして解除しなくてもデータベースのカラム設定をnullable
(null値を許可)にすればエラーは発生しなくなります。
マイグレーションファイルの場合はnullable
メソッドを実行すればOKです。
日付_create_テーブル名_table.php
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。