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

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

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

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

Laravel 5

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

Q&A

解決済

2回答

4587閲覧

【Laravel】フォーム名が動的な場合のカスタムバリデーションについて

Discord

総合スコア51

PHP

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

Laravel 5

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

0グッド

0クリップ

投稿2019/10/30 05:16

編集2019/10/30 06:16

Laravelでフォームリクエストでのカスタムバリデーションを実装しようとしています。

PHP

1class HogeRequest extends Request 2{ 3 // 通常のバリデーション 4 public function rules() { 5 $this->check_list = array (12,45,67,87,98); 6 ... 7 ... 8 } 9 10 // ここでカスタムバリデーション 11 public function withValidator(Validator $validator) { 12 $validator->after(function ($validator) { 13 foreach ($this->check_list as $key => $value) { 14 if ($this->hoge_.$value > 50) { 15 $validator->errors()->add('hoge', 'エラーです'); 16 } 17 // 下記のようなこともしたいです 18        if (count($this->hoge_check_$value) > 5) { 19 $validator->errors()->add('hoge', 'エラーです'); 20 } 21 } 22 23 }); 24 } 25}

フォームからくる値は、$this->hoge_12とかでとれるのですが、上記のように$this->check_listに配列でチェックしたい値が入っていて、foreachで回しながら、$this->hoge_.$valueみたいな感じでとりたいのですが、うまくいきません。
ちなみに$this->hoge_の後ろの数字は、ランダムでいろいろ変わってきます。

・追記
$this->hoge_check_$valueにチェックボックスの値が入っていて、チェックできるチェックボックスの数でエラーチェックしたいです。ただ、$this->hoge_check_$valueだと思うように値がとれません。

このように、$this->でわたってくる名前が動的な場合、どのようにエラーチェックすれば良いのでしょうか。
ご教示お願いいたします。

追記
HTMLも追記します。
チェックボックスには5つ以上チェックをつけたらエラーとしたいです。

HTML

1<!-- テキスト部分 --> 2<input type="text" name="hoge_45" value="40"> 3<input type="text" name="hoge_67" value="50"> 4<input type="text" name="hoge_70" value="60"> 5<!-- チェックボックス部分 --> 6<input type="checkbox" name="hoge_check_12[]" value="1"> 7<input type="checkbox" name="hoge_check_12[]" value="2"> 8<input type="checkbox" name="hoge_check_12[]" value="3"> 9<input type="checkbox" name="hoge_check_12[]" value="4"> 10<input type="checkbox" name="hoge_check_12[]" value="5"> 11<input type="checkbox" name="hoge_check_12[]" value="6"> 12<input type="checkbox" name="hoge_check_12[]" value="7"> 13コード

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

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

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

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

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

guest

回答2

0

配列でもバリデーションの指定方法がありますので、その作法に従うんがいいと思います。

https://readouble.com/laravel/5.7/ja/validation.html

イメージ説明

自分なら、以下のようにHTMLを組みますね。

<input type="checkbox" name="hoge_check_12[]" value="1"> <input type="checkbox" name="hoge_check_12[]" value="2"> <input type="checkbox" name="hoge_check_12[]" value="3"> <input type="checkbox" name="hoge_check_12[]" value="4"> <input type="checkbox" name="hoge_check_12[]" value="5"> <input type="checkbox" name="hoge_check_12[]" value="6"> <input type="checkbox" name="hoge_check_12[]" value="7">

<input type="checkbox" name="hoge_check[12][]" value="1"> <input type="checkbox" name="hoge_check[12][]" value="2"> <input type="checkbox" name="hoge_check[12][]" value="3"> <input type="checkbox" name="hoge_check[12][]" value="4"> <input type="checkbox" name="hoge_check[12][]" value="5"> <input type="checkbox" name="hoge_check[12][]" value="6"> <input type="checkbox" name="hoge_check[12][]" value="7">

投稿2019/10/30 05:19

編集2019/10/30 06:20
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Discord

2019/10/30 05:26

ありがとうございます。 通常のバリデーションではこういったことができるのはわかるのですが、今回のように値が50を超えている場合は、エラーにしたいなど、通常のバリデーションでうまくできずにカスタムバリデーションで書くことにしました。 教えていただいたページですと、私がやりたいことが実現できないような気がしまして。。 書き方が悪いのでしょうか。
退会済みユーザー

退会済みユーザー

2019/10/30 05:40 編集

HTMLの状態がどうなっているのか読み取れないので、こういった回答をしたまでです。 通常、name属性に連番を降るような運用ってアンチパターンなのですから。
Discord

2019/10/30 06:05

すみません。 HTML側はDBから値をとってきて、動的にフォームを生成しているため、nameに数字が入っています。 事情があって、HTML側は直すことができないため、バリデーションについて悩んでいました。
退会済みユーザー

退会済みユーザー

2019/10/30 06:08 編集

言葉での説明では不十分なので、出力されたHTMLをそのまま提示してくれる方が、伝わります。 技術系の質問サイトで提示する情報は、提示した情報だけで、回答者が現象を再現できるかということ。
Discord

2019/10/30 06:16

HTMLも追記させていただきました!
退会済みユーザー

退会済みユーザー

2019/10/30 06:17 編集

hoge_check_12 の 12 は <input type=text> と何か関連はあったりします?
Discord

2019/10/30 06:20

特に関係はないです!
guest

0

ベストアンサー

classなし

基本的な考え方としてはこう

PHP

1<?PHP 2foreach(array_filter($_POST,function($x){ 3 return preg_match("/^hoge_/",$x); 4},ARRAY_FILTER_USE_KEY) as $key=>$val){ 5 $$key=$val; 6} 7var_dump([@$hoge_11,@$hoge_12,@$hoge_13]); 8?> 9<form method="post"> 10<input type="checkbox" name="hoge_11" value="1"> 11<input type="checkbox" name="hoge_12" value="1"> 12<input type="checkbox" name="hoge_13" value="1"> 13<input type="submit" value="send"> 14</form>

class版

これを無理やり命題にちかづけるとこう

PHP

1<?PHP 2class hoge{ 3 var $hoge_11,$hoge_12,$hoge_13; 4 function __construct(){ 5 foreach(array_filter($_POST,function($x){ 6 return preg_match("/^hoge_/",$x); 7 },ARRAY_FILTER_USE_KEY) as $key=>$val){ 8 $this->$key=$val; 9 } 10 } 11 function get_hoge($num){ 12 return $this->{"hoge_".$num}?:null; 13 } 14} 15$hoge=new hoge; 16var_dump([$hoge->get_hoge(11),$hoge->get_hoge(12),$hoge->get_hoge(13)]); 17?> 18<form method="post"> 19<input type="checkbox" name="hoge_11" value="1"> 20<input type="checkbox" name="hoge_12" value="1"> 21<input type="checkbox" name="hoge_13" value="1"> 22<input type="submit" value="send"> 23</form>

$this->hoge_11に値を代入する部分は「$this->{"hoge_".$num}」のところ

投稿2019/10/30 06:09

yambejp

総合スコア114839

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

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

Discord

2019/10/30 06:21

ありがとうございます! $this->{"hoge_".$num}のでうまくいきそうです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問