Правила проверки Laravel для JSON - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь использовать пользовательский FormRequest с правилами проверки для данных в формате JSON. Если я использую тот же код в контроллере вместо класса FormRequest, то он работает нормально, см. Ниже:

массив данных (из запроса ajax):

[
  {
    "name": "id",
    "value": "1"
  },
  {
    "name": "title",
    "value": "My fun project"
  }  
]

Контроллер:

public function update(Request $request, $id) {
    //convert it to readable json
    $jsonReq = $request->json()->all();
    $jsonData = array();
    foreach ($jsonReq as $json) {
        $jsonData[$json["name"]] = $json["value"];
    }

    $rules = [
        'id' => 'required|numeric:1',
        'title' => 'required|max:255',
    ];

    $validation = Validator::make($jsonData, $rules);

    if ($validation->fails()) {
      return $validation->errors();
    }
}

Выше работает нормально при использовании в контроллере. Однако я хочу разделить свою проверку в отдельном классе, расширяя форму FormRequest. Это вызывает некоторые ошибки, скорее всего, из-за формата массива.

class UpdateProjectValidationRequest extends FormRequest {

      public function rules() {

        $jsonReq = $this->json()->all();
        $jsonData = array();
        foreach ($jsonReq as $json) {
            $jsonData[$json["name"]] = $json["value"];
        }

        return [
            'id' => 'required|max:1', //does not work
            $jsonData['title'] => 'required|max:255', //does not work
        ];
}

Контроллер:

  public function update(UpdateProjectValidationRequest $request, $id) {

    // validate against rules
    $request->rules();

Сообщение об ошибке:

{
  "message": "The given data was invalid.",
  "errors": {
    "My fun project": [
      "My fun project field is required."
    ],
    "id": [
      "The id field is required."
    ],

Очевидно, что это связано с форматом. Есть идеи как решить это? Обратите внимание, что после цикла foreach данные форматируются так:

{
  "id": "1",
  "title": "My Fun project",
}

1 Ответ

0 голосов
/ 03 мая 2018

Хорошо, поэтому я не смог решить ее с помощью laravel FormRequest, вместо этого я изменил сам вызов ajax, сериализовав его в json вместо массива.

    $.fn.serializeObject = function()
    {
        var o = {};
        var a = this.serializeArray();
        $.each(a, function() {
            if (o[this.name] !== undefined) {
                if (!o[this.name].push) {
                    o[this.name] = [o[this.name]];
                }
                o[this.name].push(this.value || '');
            } else {
                o[this.name] = this.value || '';
            }
        });
        return o;
    };
//old: var formdata = JSON.stringify(jQuery('#myForm').serializeArray());
var formdata = JSON.stringify(jQuery('#myForm').serializeObject());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...