はい、laravel使ってて単純なバリデーションはできていたんですが、ふとarrayの中身ってどうしてバリデーション掛けたらいいんだろってなりました。
なので今回Laravelを使ってarrayの中身の型をintにバリデーションをかけてみます。
Validationの方法
今回はstackoverflowを参考にしました。
今回はFormRequests内での処理を書きます。
FormRequestsでのバリデーションの書きかたがわからない人は先にこちらの記事を確認してみてください。
ではいきなりですが、validationをしていきたいと思います。
今回はuser情報の更新を行う想定です。
そこで退会ユーザーが出たときに、退会理由を複数選択していただくような仕様になっている想定。
複数選択されるということは、配列で送られてくるようになっているので、その配列の中身もバリデーションをかけたいということになります。
cancelled_reasons
のバリデーションの項目
- 配列 まずは配列で送られてきているのかをバリデーション
- 配列の中身をint型 送られてきた配列の中身をバリデーションしてint型を指定
<?php
namespace App\Http\Requests\User;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule; //追加
use Illuminate\Validation\Rules\Password;//追加
class UpdateUserRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
$id = $this->route('user'); //idをurlから取得
return [
'name' => ['string', 'max:255'],
'email' => ['string', 'email', 'max:255', Rule::unique('www_users')->ignore($id)],
'password' => [Password::min(8)->mixedCase()->numbers()],
'cancelled_reasons' => ['array', 'nullable'], //退会理由を複数選択できて、配列でリクエストパラメータが送られてくる。
'cancelled_reasons.*' => ['integer'] //arrayの中身のバリデーション
];
}
}
Code language: HTML, XML (xml)
もし、cancelled_reasons
が配列の中身がint型でリクエストパラメータとして送られてこなかった場合は以下
配列で「○○番目がint型じゃないよ」って教えてくれます。
"success": false,
"summary": "Insert Failed",
"details": {
"cancelled_reasons.0": [
"The cancelled_reasons.0 must be an integer.",
]
}
Code language: JavaScript (javascript)
今回はcancelled_reasons.*
でruleを書いたので、.*
この部分で配列の何番目のruleとかも指定できるっぽい。リクエストパラメータ.配列の番号
って感じで指定できるようだな。
まとめ
これで配列の中身もvalidateできたので一件落着。
そこまでがっつり調べてないけど、体感的に英語で調べた方がすぐに解決策が出てきた。
日本語の方が安心感はあるけども、やっぱり情報量としては英語なのか….