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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

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

Laravel 5

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

Q&A

解決済

2回答

923閲覧

Laravel5.7でJSON内の値のバリデーションをする

hatsuo

総合スコア14

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

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

Laravel 5

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

0グッド

0クリップ

投稿2019/06/24 03:23

編集2019/06/24 03:28

前提・実現したいこと

Laravel5.7で入力フォームを作成しています。
今回の課題の項目Aは連想配列のJSONテキストがセットされます。
FormRequestを使ったバリデーション時だけ、このJSONを配列にデコードしてから配列内の値をチェックしたいです。
バリデーション時以外はJSONの状態を維持したいです。

バリデーション時だけ入力値を変換(この場合はJSON→配列に)する方法はありますでしょうか。
もしくはJSONを変換しなくても中身に対してバリデーション適用する方法はありますか?
ご助言いただければ幸いです。

発生している問題・エラーメッセージ

all()でJSONを配列に変換している為、
バリデーション時以外も項目Aが配列になってしまいます。
all()で変換する運用をやめたいです。

該当のソースコード

現状は下記のようにJSON配列のaをall()で配列に変換してからルール適用しています。

PHP

1class SampleRequest extends FormRequest 2{ 3 public function rules() 4 { 5 return [/* validate */ 6 'other1' => ['nullable'], 7 'other2' => ['nullable'], 8 'a.*.id' => ['required','digits_between:0,9'], 9 'a.*.name' => ['required_with:a.*.id','string'], 10 'a.*.options.*.id' => ['required_with:a.*.id','digits_between:0,9'], 11 'a.*.options.*.name' => ['required_with:a.*.id','string'], 12 ] 13 } 14 public function all($keys = null) 15 { 16 $results = parent::all($keys); 17 $results['a'] =json_decode($results['a'], true); 18 return $results; 19 } 20}

これをrules適用前後のみ配列にするようにしたいです。(バリデーション時以外はJSONのまま扱いたい)
あるいはJSONの中身に対するバリデーション設定する方法、みたいなものが知りたいです。

試したこと

公式ドキュメントを確認しましたが、英語なのでよくわかりませんでした。
jsonかどうかのバリデーションはありましたが、それは求めているものと違いました。

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

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

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

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

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

guest

回答2

0

ベストアンサー

バリデータ生成のmake()の第1引数は対象のリクエストなので、そこで適当なキーに値を対象の配列を入れてバリデータルールを適用すれば良いのではないのでしょうか。
バリデータ生成時にのみ値を配列化するのであればJSON文字列に影響はないはずです。

投稿2019/06/24 03:50

m.ts10806

総合スコア80850

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

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

hatsuo

2019/06/25 01:54

ありがとうございます。ご提案いただいた形で実装できました! return Validator::make($this->_all($request),  という形で、_all()に値編集をするメソッドを用意する形にしたところ、バリデーション時のみ編集できました。
m.ts10806

2019/06/25 01:55

ヒントになったようで何よりです。
guest

0

rulesとallの関係がよくわからないのとaを抜き出している(?)処理が
イマイチ何をしたいのかわからない

jsonデータの一部をマッチさせてチェックするなら不正な値だったときに
nullや空文字に置き換えてjsonに戻す処理を書けばよいのでは?

投稿2019/06/24 03:41

yambejp

総合スコア114777

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

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

hatsuo

2019/06/25 01:58

> jsonデータの一部をマッチさせてチェックするなら不正な値だったときに > nullや空文字に置き換えてjsonに戻す処理を書けばよいのでは? ご助言ありがとうございます。 手動で書く分にはそれで実装できるのですが、できるだけコードをシンプルにしたく、個別処理でなくLaravelのフレームワークに用意されたバリデーションを他のrequestと同じように適用する方法がないかを探していました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問