カテゴリー
Linux

Laravel7 のバリデーションで公式ドキュメントで触れられていないルールオブジェクトの便利な使い方

Laravel7 で入力値そのものと入力値を分割した配列の両方を一度にバリデーションするためのルールの書き方 – oki2a24 を改善する話です。

ルールオブジェクトまとめ

公式ドキュメントに書いてあること

  • ルールオブジェクトの使用 – カスタムバリデーションルールのメソッドを定義
  • php artisan make:rule <name> コマンドで app/Rules ディレクトリに新しいルールオブジェクトのファイルを生成できる。
  • passes($attribute, $value) メソッドでバリデーションを行う。
    • $attribute: フォームの属性名
    • $value: フォームに入力された属性値。これをバリデーションすることになる。
  • フォームリクエストクラスの rule メソッでのルールオブジェクトの使用方法は、ルールを書く場所にインスタンス化すれば良い。そのため、ルールを書く際は文字列を | で区切るのではなく、配列で定義することになる。

公式ドキュメントに書いてないこと (こちらを本ページで扱う)

  • クロージャの使用 – カスタムバリデーションルールのメソッドを定義 のみを使う場合、カスタムバリデーションルールが 2 つ以上になるとテスト時にどのクロージャがテストに該当するのかわからなくなる。そのため、クロージャを利用せずにルールオブジェクトのみを使うのも良いと思う。
  • どうやらルールオブジェクトは 1 回のバリデーションで使ったオブジェクトをそのままエラーメッセージ出力時でも使うようだ。したがって、ルールオブジェクトクラスのコンストラクタやプロパティ (クラスのメンバ変数) を使って応用を効かせることができる。
  • passes メソッドで $attribute$value 以外の値を使いたい (例えばバリデーション時の判定に使う最大数とか) 場合は、ルールオブジェクトのコンストラクタで渡す。
  • message メソッドで例えば passes メソッド内で出てきた値を使いたい場合は、passes メソッド内からプロパティに渡してやればよい。
カテゴリー
Linux

Laravel7 で入力値そのものと入力値を分割した配列の両方を一度にバリデーションするためのルールの書き方

ポイント

  • フォーム値の事前加工 は使えない。なぜなら加工前の値もバリデーションしたいため。
  • クロージャの使用 – カスタムバリデーションルールのメソッドを定義 し、その中でフォーム値を加工してバリデーションを行う。
    • ただし、 rules メソッド内に 2 つ以上のクロージャのルールが存在するとテスト時にどのクロージャがテストに該当するのかわからなくなる。そのため試してはいないが ルールオブジェクトの使用 – カスタムバリデーションルールのメソッドを定義 をした方が良いと思われる。
    • 今回はクロージャの使用を押し通したため、テストではエラーメッセージを確認することでどのルールで不正となったかを確かめている。
  • カスタムバリデーションルールのメソッド内では 'required', 'email:rfc,spoof' といったバリデーションルールを宣言できない。とはいえ該当するバリデーションロジックを書くのは車輪の再開発となり、おかしい。探すと、 Illuminate\Validation\Concerns\ValidatesAttributes トレイトに各バリデーションルールの実装となっているのでこれを use して利用する。
カテゴリー
Linux

Laravel のイベントリスナーメソッドをユニットテストする方法

例。ユーザー削除時に連携するサービスも削除するイベント

実際に書いたコードから少し内容を変えており、実際に動かない可能性がありますことを最初にお断りします。エッセンスを伝えるためのコードとなります。

例えば、ログインに外部の OpenId Connect サービスを使う場合、今回は Google としましょうか。ユーザーを作成したときは Laravel の googles テーブルに連携時のデータを保存しているものとし、モデルでは user->google でアクセスできるものとします。

ユーザーを削除する時にイベントを実行し、リスナーで Laravel の google レコードを削除するとします。この時のリスナーの handle メソッドを、次のようにテストしました。

カテゴリー
Linux

Supervisor を Docker で使用しているとき、ログを標準出力して Docker ログに出力できるようにする

Docker イメージ php:7.4.5-apache で Apache の他に cron も動かす方法 – oki2a24 のcrond の実行ログを docker のログに出力するようにしたと思ったが出力されていない、という問題に対処できました。

ポイント

  • 対象のプロセスのログを stdout や stderr へ出力しておくことが必要
  • Supervisor の対象プロセスの設定で、ログを stdout や stderr へ出力するように設定
  • どちらか一方ではダメで、対象プロセス自身のログと Supervisor の対象プロセスの設定の両方で stdout や stderr へ出力すること
カテゴリー
Linux

Laravel のモデルのリレーション先のモデルを削除するベストプラクティス

関連したモデルの挿入、更新については公式ドキュメントに記述があります。

しかし、削除については言及されていません。

そこで、自分なりにたどり着いた最適な削除方法を残します。

カテゴリー
Linux

Laravel のバリデーションクラスであるフォームリクエストをユニットテストするためのノウハウ

フォームリクエストバリデーション – バリデーション 7.x Laravel にあるように、バリデーションロジックを含んだカスタムリクエストクラスを作成して利用することはよくあります。

しかし、フォームリクエストをどうやってユニットテストすれば良いのかについては、 Laravel ドキュメントに記載がありません。

自分自身がさまざま調べ、現在行っているユニットテストの方法を記したいと思います。

カテゴリー
Linux

Laravel バージョンを 6 から 7 へとアップグレードした時のメモ

カテゴリー
Linux

Docker イメージ php:7.4.5-apache で Apache の他に cron も動かす方法

はじめに

oki2a24/sample_dockerized_laravel6: Laravel6 を Docker 化するサンプルです。 にて Laravel を Docker コンテナ化しました。

Apache 入りの PHP コンテナで Laravel を動かしています。この Laravel で タスクスケジュール 6.x Laravel も行いたいと思いました。

cron を動かせば簡単です。

しかし、 コンテナではすでに Apache のプロセスが動いており、ここに cron を足せません。

これを、なんとかしたのが本投稿となります。

カテゴリー
Linux

Laravel 6 と 7 の差分を見る

GitHub にホストした版の差分

確認の仕方

  1. Laravel 6 をインストールする。
  2. Laravel 6 を git 管理する。
  3. .git/ 以外全部削除する。
  4. Larvel 7 をインストールする。
  5. 差分を確認する。
カテゴリー
Linux

Laravel 6 で今データベース接続がどうなっているか簡単に確認する方法

まとめ

php artisan tinker
DB::connection()->getConfig();
DB::connection()->getPdo();

接続名も例えば DB::connection('foo')->getConfig(); のようにして指定可能です。