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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Q&A

解決済

1回答

4182閲覧

LaravelのValidatorのsometimesメソッド

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

0グッド

0クリップ

投稿2020/05/16 08:29

LaravelのValidatorのsometimesメソッド

Laravelのvalidatorのsometimesメソッドに関する質問です。

Laravelの入門書で勉強しているのですが、その本では「sometimesメソッドの第三引数のクロージャーの戻り値がfalseの場合は、sometimesで指定したルールを指定の項目に追加する」と書かれています。

公式ドキュメントには「trueであれば、ルールを追加する」と書かれており、矛盾しているように思います。

入門書に書かれているコードは以下になります。

確かに、以下のコードでは$input->ageが整数のとき、すなわち!is_int($input->age)falseのときに、max:200min:0のルールが追加された挙動を示していました。

しかしながら、公式ドキュメントのコードを書いた場合は、クロージャーがtrueを返したときにルールが追加されていました。

どこか勘違いしている箇所ありますでしょうか?

入門書のコード

php

1<?php 2public function post(Request $request) 3{ 4 $validate_rule = [ 5 'name' => 'required', 6 'mail' => 'email', 7 'age' => 'numeric', 8 'games' => 'required|numeric', 9 ]; 10 11 $messages = [ 12 'name.required' => '名前は必ず入れてください。', 13 'mail.email' => 'メールアドレスが必要です', 14 'age.numeric' => '年齢を整数で記入してください', 15 'age.max' => '年齢は200歳以下で入力してください', 16 'age.min' => '年齢は0歳以上で入力してください', 17 ]; 18 19 $validator = Validator::make($request->all(), $validate_rule, $messages); 20 21 $validator->sometimes('age', 'min:0', function($input) { 22 return !is_int($input->age); 23 }); 24 25 $validator->sometimes('age', 'max:200', function($input) { 26 return !is_int($input->age); 27 }); 28 29 if ($validator->fails()) { 30 return redirect('/hello')->withErrors($validator)->withInput(); 31 } 32 33 $data = ['msg' => '正しく入力されました。']; 34 35 return view('hello.index', $data); 36 } 37 38 39$validator = Validator::make($request->all(), $rules, $messages); 40

公式ドキュメントのコード

php

1<?php 2$v = Validator::make($data, [ 3 'email' => 'required|email', 4 'games' => 'required|numeric', 5]); 6 7$v->sometimes('reason', 'required|max:500', function ($input) { 8 return $input->games >= 100; 9});

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

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

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

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

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

m.ts10806

2020/05/16 08:35

書籍とドキュメントと実際のご自身の環境 バージョンは全て同じなのでしょうか。
退会済みユーザー

退会済みユーザー

2020/05/16 08:42

書籍はLaravel 5.4 ドキュメントはLaravel 5.5 自身の環境は Laravel 7.10.3のようです。 ドキュメントでLaravel 7.xのものも確認しましたが、Laravel5.5のものと記述は同じでした。
m.ts10806

2020/05/16 08:48

Laravelの入門書・・・とやらが「青本」なら今すぐやめたほうがいいですね。 望ましい実装してないことで有名です(Laravel重用者には評判が悪い) あと、さすがにメジャーバージョンが2つも違えばドキュメントが同じように見えても使えないですよ。 参考資料は自身の環境にあわせたものを利用しないと何の参考にもなりません。
退会済みユーザー

退会済みユーザー

2020/05/16 08:54

コメントありがとうございます。 表紙が青いので、これはきっとその青本なのでしょうね。。。 ドキュメントは何も考えずにググって上の方にでてきたものをみてました、これからはバージョン意識いたします。
guest

回答1

0

ベストアンサー

こちら、解決いたしました。

vendor/laravel/framework/src/Validation/Validator.phpには、以下のように書かれており、クロージャがtrueを返す場合にルールを追加することが分かりました。(公式ドキュメントにも書かれているので当たり前ではありますが。。。)

で、なにが問題だったかというと、入門書のコード内の$input->ageが、数値を入力していても、型はstringでした。
そのため、入門書の「falseのときにルールを追加する」という記述が誤りであったことが分かりました。ありがとうございました。

Validator.php

php

1<?php 2 public function sometimes($attribute, $rules, callable $callback) 3 { 4 $payload = new Fluent($this->getData()); 5 6 if ($callback($payload)) { 7 foreach ((array) $attribute as $key) { 8 $this->addRules([$key => $rules]); 9 } 10 } 11 12 return $this; 13 }

投稿2020/05/16 09:57

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問