tohokuaikiのチラシの裏

技術的ネタとか。

Laravelの配列をValidateする時の指定とかエラーメッセージの加工とか

JSONで投げられる値で

{
  address: "Tokyo", 
  entries: [
    {name: "", email: ""},
    {name: "", email: ""}
    {name: "", email: ""}
  ]
}

みたいなのをValidateしたい時。

単にVlidateすればいい場合

FormRequestのルールに

<?php
    public function rules()
    {
        return [
            'entries.name' => ['required'],
        ];
    }

と書いておけばいい。

エラーメッセージは

こんな感じ。

<?php
    public function messages()
    {
        return [
            'entries.name.required' => '氏名は必須です。',
        ];
    }

配列のインデックスをエラーメッセージに入れたい場合

上述の場合、

<?php
    public function rules()
    {
        return [
            'entries.*.name' => ['required'],
        ];
    }

と書いてもValidateしてくれる。そして、この指定をした場合にはエラーメッセージに

<?php
    public function messages()
    {
        return [
            'entries.*.name.required' => '氏名は必須です。',
        ];
    }

としておくと、エラーで返ってくるJSON

{ errors: 
    entries.0.name: '氏名は必須です。',
    entries.1.name: '氏名は必須です。',

となる。

このエラーメッセージに配列のインデックスを入れたい場合は、 stackoverflow.com を参考にして

<?php
    public function messages()
    {
        $messages = [];
        foreach ($this->request->get('entries') as $key => $entry) {
            $messages['entries.' . $key . '.name.required'] = . $key . 'の氏名は必須です。';
        }
        return $messages;
    }

としておくといける。