質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

3125閲覧

Laravel に よる カスタムバリデーション実装

ShintaroIshida

総合スコア87

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2019/02/09 09:53

前提・実現したいこと

Laravel 5.7 で、カスタムバリデーションの実装に関してです。
以下のルールでバリデーション掛けたいと思っています。
※ ソースは適当です

HTML

1<form> 2項目:A 3<input type="text" name="a"> 4 5項目:B 6<input type="text" name="b"> 7 8</form>

項目:A・Bは通常必須属性ではない。
項目:A ・B共に入力がない場合、どちらかに値が存在しないといけない。

抜粋ですが以下のようなバリデートルールをクロージャーで実装してみました

php

1// 項目:Bに対するバリデーションルールです 2[ 3 function( $attribute, $value, $fail ) { 4 5 if ( empty( $this->getValue( 'a' ) ) && empty( $this->getValue( $attribute ) ) ) { 6 return $fail( '項目:Bの入力が必要です' ); 7 } 8 } 9];

正常に動きません。原因は分かっています。

  • getValue 上記形式だと使えない
  • request オブジェクトを引き渡す方法が分からない
  • 項目:Bが未入力だとそもそもバリデートが動かない

こういった場合、リファレンスを見て Rule オブジェクトを実装するか?Request オブジェクトを実装するか?
という情報も見てみたのですが、どの方法が良い方法なのかがいまいちわかりません。

required_with、required_without 等も要件とちょっと違う挙動になります。

具体的にこう実装したって方いらっしゃないでしょうか?
仕様自体はそう珍しいものではないので、むりくりやればいいんでしょうが、
FWのお作法に則った実装が出来れば知りたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

今回の目的にはカスタムバリデーションなどを用意するまでもなく、

php

1[ 2 'a' => 'required_without:b', 3 'b' => 'required_without:a', 4]

で良いのではないかと思います。

なお参考までに未入力でも検査を行うようなルールを追加するには、Validator::extendImplicitを使います。マニュアル「バリデーション」の「暗黙の拡張」を見てください。

投稿2019/02/10 00:20

crhg

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ShintaroIshida

2019/02/12 00:49

リファレンスを読んで色々と試したつもりだったのですがテストが足りなかったようです。 提示してもらったルール定義で想定通りの挙動を確認しました。 もう少し読んだ内容をソースで確認する事をちゃんとしようと思います。 ありがとうございました。
guest

0

このフォームに対して

php

1<form action="/" method="POST"> 2 @csrf 3 4 <input type="text" name="a"> 5 <input type="text" name="b"> 6 7 @foreach($errors->all() as $error) 8 {{ $error }} 9 @endforeach 10 11 <button type="submit">Submit</button> 12</form>

方法1

Rule::requiredIf()を使うこと。

php

1// 上に 2use Illuminate\Validation\Rule; 3 4// クラス内に 5public function store(Request $request) 6{ 7 $request->validate([ 8 'a' => Rule::requiredIf(!$request->b), 9 'b' => Rule::requiredIf(!$request->a), 10 ]); 11 12 return $request->all(); 13}

方法2

aとbをマージして、マージした項目を必須にすることでどうでしょうか?

php

1public function store(Request $request) 2{ 3 $request->merge([ 4 'a_and_b' => $request->a . $request->b, 5 ]); 6 7 $request->validate([ 8 'a_and_b' => 'required' 9 ]); 10 11 return $request->all(); 12}

投稿2019/02/10 00:15

編集2019/02/10 00:20
Bremenkanp

総合スコア205

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ShintaroIshida

2019/02/12 00:53

今回のルールを繰り返し使うのであればRuleクラスの実装も視野にいれていたのですが単体要件だったので見送っています。request パラメータをマージして比較参照するという手もまったく考え付かなかったので、挙動の勉強になりました。ありがとうございます。 今回は、単体要件であったのと既存のルールで実装出来るよと提示頂いたchrg さんをベストアンサーとさせて頂きました。ご了承ください。 Rule実装時に是非とも参考にさせて頂きます。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問