Laravelネタが多い…個人的にはC#の方が好きなんだけど、Laravel業務で使ってるしね…
Laravelでちょっと複雑なValidationをやりたかったのですが、調べた感じでは2つの方法があります。

前提


Laravel 4.2で試してるけど5.x系でもドキュメント見る限りは変わってないのでおそらく一緒。

やりたかったことの例


アンケートでよくあるような 「質問で1を選んだ場合は理由を必須入力にしたい」 的なのがやりたかったのです。

方法1 sometimes使う


まず、方法その1。
公式ドキュメントのsometimesを使う。

1
2
3
4
5
6
7
8
9
10
11
12
//その他のルール
$rules = ['age' => 'required',
 ・・・・・
];

//Validatorインスタンス生成
$validator = Validator::make($data, $rules);

//メソッドチェーンでsomeimesメソッドを呼んで、クロージャーで質問が1の時という条件を書く
$validator->sometimes('reason', 'required', function($data) {
return (int)$data['question'] === 1
});

方法2 ルール生成時に条件分岐させる


たぶん、こっちで事足りる。

1
2
3
4
5
6
7
8
9
10
11
12
//その他のルール
$rules = ['age' => 'required',
 ・・・・・
];

//Validatorインスタンス生成前に質問が1の場合はルールを格納している連想配列に新たなルールを追加する
if ($data['question'] === 1) {
$rules['reason'] = 'required';
}

//Validatorインスタンス生成
$validator = Validator::make($data, $rules);

結論


どっちがいいかは何とも言えないのだけどsometimesを使うケースだと、Validatorインスタンス生成後にさらに条件を記述するような形になってしまう。(インスタンス生成前に記述する方法はあるかもしれない)
また、ルールを生成する箇所だけ別のメソッドで書いてるケースがあったりするので、個人的には方法2でいいのではないかと思います。