5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravel で ORバリデーション

Last updated at Posted at 2019-12-16

バリデーションを記載していると、orのバリデーションが欲しくなる時がたまにある。
だがLaravelにOrのバリデーションが存在しない。
正規表現で対応できることも多いが、今回は既存バリデーションをそのまま使用したかったのでor判定する新しいバリデーションを作成してみた

ORバリデーション

メッセージはもうちょっと改良の余地あり。
エラーになったバリデーションメッセージを連結するほうがいいかも。

OrRule.php
namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use Illuminate\Support\Facades\Validator;


class OrRules implements Rule
{
    private $rules = [];

    function __construct(Array $rules)
    {
        $this->rules = $rules;
    }

    /**
     * バリデーションの成功を判定
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        foreach ($this->rules as $rule) {
            $validator = Validator::make([$attribute => $value], [
                $attribute => $rule
            ]);

            if (!$validator->fails()) {
                // エラーなしなら終了
                return true;
            }
        }
        return false;
    }

    /**
     * バリデーションエラーメッセージの取得
     *
     * @return string
     */
    public function message()
    {
        return ':attribute は正しい形で入力してください';
    }
}
使い方
// 画像ファイルまたはURLまたはbooleanなら通す ルール定義
[
    'image' => [new OrRules(['mimes:jpeg,bmp,png', 'url', 'boolean'])]
]

開発経緯

開発経緯を少しだけ。

ちょっと仕事で複数画像を順番を保持しつつ登録処理を書かなければならないことがあった。
登録するときはすべて新規登録のため、画像のルールもmimesだけで問題なかったが・・・

問題は更新するときだった

画像の更新対象がわからない問題

更新するときは以下の3つの状態をLaravel側で認識しないといけなかったため、単純にmimesだけ通すルールだと判断ができなかった。

  • 「どの画像が更新されたか」
    • これはmimesで問題ない
      • input に画像がセットされるため
  • 「どの画像が更新されていないか」
    • これはどうやって?
  • 「どの画像が削除されたか」
    • これはどうやって?

色々考えた結果、以下の考えのもと処理を作成。

  • 「どの画像が更新されたか」
    • これはmimesで問題ない
      • input に画像をセット
  • 「どの画像が更新されていないか」
    • 登録画像パスのままなら更新されていない
      • input に登録画像URLをセット
  • 「どの画像が削除されたか」
    • falseなら削除されている
      • 画像の設定が削除されたらinput にfalseをセット

このため、「mimesまたはurlまたはboolean」のバリデーションルールが必要になり、
上記に示したORバリデーションを作成することになった。

正直、このやり方がベストなのかどうかまではわからん。。。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?