どうやらprepareForValidationはLaravel5.3以降から使えるらしい

この記事は「ウィルゲート 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のソースコード確認してみます。

github.com

Laravel5.3のソースコード

見ての通り、Laravel5.3でもprepareForValidationが用意されていることが分かります。
※ ここでは詳細に説明しないが、バリデーション前にprepareForValidationが実行されることも確認できる
※ 当時のPullRequest。最初はbeforeValidationという名前だったらしい

おわりに

prepareForValidationはドキュメント上ではLaravel6系以降にしか記述はありません。しかし、Laravel5.3以降であれば当該メソッドを使用することができます。
また、ドキュメントだけでなく実際にソースコードやCHANGELOG、PullRequestを確認してみましょう。場合によっては、今回の例のように使えないと思っていた機能が実は使える可能性があります。

「ウィルゲート Advent Calendar 2023(https://adventar.org/calendars/8986)」、翌日は野中さんによる「【入社エントリ】入社した結果、ほぼ全てが変わった」です。 お楽しみに!

参考資料