ねうねう技術らくがき日記

技術的なメモとか何か

ピュアPHPにLaravelを導入する話

タイトル詐欺です。Laravel導入は技術的にも政治的にも厳しいので、Laravelを構成しているモジュールの一つ「illuminate\validation」を導入してみるお話。

成果物

github.com

導入前の問題点

今のプロジェクトでは、管理画面側のバリデーション処理に登録画面ごとに専用のValidatorクラスを作っている。

github.com

この方法だと、

  • カラム追加する場合にHTMLとControllerとValidatorをいちいち直さなくてはならない。
  • Controllerクラス単体で見ると、どのカラムに対してバリデーションがかかるのかわからない
  • Validatorクラス単体で見ると、どんなカラムが渡されるかわからない
  • Validatorクラス内の書き方が統一されていないため、各カラムに対してどのような制約がかけられているのかも非常にわかりづらい

といった地獄みたいな状況になっている。

illuminate\validationを使うことにした理由

まず、Validatorクラス内にカラムが定義されていることが一番の原因だと思ったので、これを解決する方向で考えた。

validate($_POST);

みたいな処理を

validate($_POST['name'], $_POST['amount'], $_POST['ref_url']);

といった感じに、直接値を渡す方式に変更。 ただ、これでは呼び出し元で各値の存在チェックをしなくてはならないのでナンセンスである。

validate($_POST, 'name', 'amount', 'ref_url');

こんな感じでカラム名だけ渡す方式にすれば、ひとまずこの問題はクリア。

次に、呼び出し元(Controller)から各カラムに対する制約を読み取れるようにすることを考えた。外からバリデーションルールを渡しちゃえば、この問題は解決できると考えたので、以下のようなメソッドを作ることを考えた。

validate($_POST, [
        'name' => 'required|string|min:2|max:10',
        'amount' => 'required|integer|gte:1',
        'ref_url' => 'required|url',
]);

ここで「これどっかのフレームワークで見たことあるやつだ……」ってなった。

自分の知っているPHPフレームワークの中だと、一番書きやすいし導入しやすいと思ったのでLaravel(のIlluminate/Validation)を使うことにした。

導入方法

プロジェクト内にcomposer導入済みであることが前提。

PHPバージョン固定したい場合は先に以下のコマンドをたたいておく。

composer config platform.php 7.3.29

インストール

composer require illuminate/validation

バリデーションメッセージデータの取得

php -r "copy('https://readouble.com/laravel/8.x/ja/install-ja-lang-files.php', 'install-ja-lang.php');"
php -f install-ja-lang.php
php -r "unlink('install-ja-lang.php');"

ここまですればオートローダーを使ってValidatorクラスを呼び出すことができる。ただし、illuminate\validationには言語ファイルを読み込むための機能が標準装備しており、直接インスタンスを生成することは難しい。

そこで以下のようなFactoryクラスをかませることで簡単に呼び出せるようにする。 github.com

参考

https://readouble.com/laravel/8.x/ja/validation-php.html

https://medium.com/@jeffochoa/using-the-illuminate-validation-validator-class-outside-laravel-6b2b0c07d3a4