この記事は「ウィルゲート Advent Calendar 2023」の 18 日目の記事です。 adventar.org
こんにちは、ウィルゲート開発室の武田です。
今回はLaravelの prepareForValidation
というドキュメント上にはLaravel6系から追加されたメソッドを、それよりも古いバージョンで使用することが出来るのかを調べる機会があったのでそれについて紹介させて頂きます。
はじめに
ある日のウィルゲートの執務室。
とある機能を実装するためにprepareForValidation
が必要なことがわかりました。ところがドキュメントを見てみると、当該メソッドの説明はLaravel6系以降にしか記述されていません。改修対象のシステムはLaravel5.5であったため、prepareForValidation
を使うことは叶わないのかと私は肩を落としました。
しかし、過去に "ドキュメントに記述されている内容と実装されている機能はイコールではない" 可能性があることを身を以て知っていた私は「何とかインチキできるんじゃないの?」と執念深くLaravelのCHANGELOGを漁り始めました。
そして調べていくと、どうやらprepareForValidation
はLaravel5.3.23の時点で既に追加されていた機能なのでした。
そもそもprepareForValidationとは
prepareForValidation
は、バリデーション前にリクエストデータを処理するメソッドです。例えば、リクエストデータのフォーマットを変更したり、不要なデータを削除したりするときに使用します。
以下はフォーム等から送信されたスラグをバリデーションが適用される前にユーザーフレンドリーなスラグに変換する例です。
use Illuminate\Support\Str; /** * Prepare the data for validation. * * @return void */ protected function prepareForValidation() { $this->merge([ 'slug' => Str::slug($this->slug), ]); }
※ Laravelの公式ドキュメントより引用
※ 実際には FormRequest
を継承したクラス内でオーバーライドして実装する
実際にLaravel6系以前のソースコードを見てみる
実際にGitHubでLaravel5.3のソースコード確認してみます。
見ての通り、Laravel5.3でもprepareForValidation
が用意されていることが分かります。
※ ここでは詳細に説明しないが、バリデーション前にprepareForValidation
が実行されることも確認できる
※ 当時のPullRequest。最初はbeforeValidation
という名前だったらしい
おわりに
prepareForValidation
はドキュメント上ではLaravel6系以降にしか記述はありません。しかし、Laravel5.3以降であれば当該メソッドを使用することができます。
また、ドキュメントだけでなく実際にソースコードやCHANGELOG、PullRequestを確認してみましょう。場合によっては、今回の例のように使えないと思っていた機能が実は使える可能性があります。
「ウィルゲート Advent Calendar 2023(https://adventar.org/calendars/8986)」、翌日は野中さんによる「【入社エントリ】入社した結果、ほぼ全てが変わった」です。 お楽しみに!