2017-07-13 10 views
0

サーバ側でLaravelを使用しています。コントローラが2つのフィールドurl [文字列]とdata [インデックスのある配列head]を受け取ったとしましょう。私たちは、データを検証し、検証が、Laravelは、我々は以下のように、JSONを送信するために応答データを変換することができますどのようにJSONデータLaravel検証メッセージのドットシンタックスを配列に変換する

{ 
    "url": ["The url field is required"], 
    "data.head": ["The data.head field is required"] 
} 

とレスポンスを返送失敗した場合

$this->validate($request, [ 

    'url' => 'required', 
    'data.head' => 'required', 

], [ 

    'url.required' => 'The :attribute field is required', 
    'data.head.required' => 'The :attribute field is required', 
]); 

でエラーメッセージをカスタマイズすることができますか?

{ 
    "url": ["The url field is required"], 
    "data": { 
     "head": ["The data.head field is required"] 
    } 
} 

答えて

1

Laravelには、ドットベースの表記法を配列に変換するarray_setというヘルパーがあります。私はあなたがAJAX経由でエラーを送信方法を知りませんが、あなたがそのような何かを行うことができるはず

$errors = []; 
foreach ($validator->errors()->all() as $key => $value) { 
    array_set($errors, $key, $value); 
} 

編集: しかし、どうやら、あなたは、ドットを使用しないことができるはずですこの例のようにSpecifying Custom Messages In Language Filesによって表記:

'custom' => [ 
    'email' => [ 
     'required' => 'We need to know your e-mail address!', 
    ], 
], 
+0

I'am紛らわしいです。 Laravelが自動的に応答してドット構文を変換しなかったのはなぜですか? – Evgeniy

+0

私は編集しました、私の答えです。私は推測していますが、Laravelは指定した形式を保持しています。少なくとも、それは私にとって理にかなっていますが、後でドット表記を使用する点は見当たりません。 – cbaconnier

+0

もちろん、私は別のファイルでカスタムメッセージについて知っていますが、私の問題を決めるわけではありません。私は返信する前にメッセージの変換を使用します。 – Evgeniy

0

、私はそれはまだlaravelにドット表記を使用したカスタム検証を作成するが、有効な質問だ場合、あなたはvalidation.php

にこのような配列を指定することができるかわかりません
'custom' => [ 
     'parent' => [ 
      'children' => [ 
       'required' => 'custom message here' 
      ] 
     ] 

これはparent.childrenプロパティです。

yaを参照してください。エラー

error: function (errors) { 
    $.each(errors['responseJSON']['errors'], function (index, error) { 
     var object = {}; 
     element = dotToArray(index); 
     object[index] = error[0]; 
     validator.showErrors(object); 
    }); 
} 

上のJavaScript

ループにおいて

0

は配列記法にドット表記に変換します。すなわちabc.1.xyz ABCへの[1] [XYZ]

function dotToArray(str) { 
    var output = ''; 
    var chucks = str.split('.'); 
    if(chucks.length > 1){ 
     for(i = 0; i < chucks.length; i++){ 
      if(i == 0){ 
       output = chucks[i]; 
      }else{ 
       output += '['+chucks[i]+']'; 
      } 
     } 
    }else{ 
     output = chucks[0]; 
    } 

    return output 
} 
関連する問題