Как исключить все данные, которые не прошли проверку laravel?

Мне нужны только данные, прошедшие проверку. И не хочу никаких ошибок или перенаправления с помощью laravel-validation. До сих пор мне удавалось остановить перенаправление с помощью laravel-request, но validation, похоже, не работает должным образом, если я оставлю метод failedValidation не throw ни exception.

У меня есть массив данных от user, который может заполнить строки или оставить их пустыми. Если они оставляют обязательные поля пустыми в строке, я хочу исключить их из окончательных данных после validation.

ExpenditureExtry.php

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;

class ExpenditureEntry 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()
  {
      return [
        'date' => 'required',
        'description.*' => 'nullable',
        'account_head.*' => 'required',
        'amount.*' => 'required_with:account_head.*'
      ];
  }

  /**
   * Failed validation disable redirect
   *
   * @param Validator $validator
   */
  protected function failedValidation(Validator $validator)
  {
    //throw new HttpResponseException(response()->json($validator->errors(), 422));
  }

}

Внутри контроллера

public function store(ExpenditureEntry $req)
{
   return $req->validated();
}

Я хочу, чтобы это возвращало только те данные, которые прошли проверку. На данный момент он возвращает все данные.

Ожидаемый результат

// http://127.0.0.1:8000/expenditure/add
{
  "date": "03 Sep 2018",
  "description": {
    "1": null,
  },
  "account_head": {
    "1": "5",
  },
  "amount": {
    "1": "5000",
  }
}

Фактический результат

// http://127.0.0.1:8000/expenditure/add
{
  "date": "03 Sep 2018",
  "description": {
    "0": null,
    "1": null,
    "2": null,
    "3": "sas asd adas",
    "null": null
  },
  "account_head": {
    "0": "3",
    "1": "5",
    "2": null,
    "3": null,
    "null": null
  },
  "amount": {
    "0": null,
    "1": "5000",
    "2": "5000",
    "3": null,
    "null": null
  }
}

Я также пытался использовать Validator::make в контроллере, но он также не работает должным образом:

Внутренний контроллер

public function store(Request $req)
{
  $validator = Validator::make($req->except(['account_head.null', 'description.null', 'amount.null']), [
    'date' => 'required',
    'account_head.*' => 'required',
    'description.*' => 'nullable',
    'amount.*' => 'required_with:account_head.*'
  ]);
  return $validator->valid();
}

Вывод

// http://127.0.0.1:8000/expenditure/add
{
  "_token": "EmiRpnXhPHUPl3HIzuYLrtuLaGj9Ruv8AySe11Bp",
  "date": "03 Sep 2018",
  "description": [
    null,
    null,
    null,
    "sas asd adas"
  ]
}

PS: если возможно, мне нужно решение на основе laravel. Если такое решение невозможно, у меня есть решение просто проверить их вручную.

Мое решение Проверил все данные и проверил их вручную. Моя проблема с этим подходом заключается в том, что теперь я не могу использовать другие функции проверки из laravel, и когда мои поля увеличиваются, я не думаю, что запись условия поможет мне.

public function store(Request $req)
{
  $datas = $req->except(['_token', 'account_head.null', 'description.null', 'amount.null']);

  $countR = count($datas['account_head']);
  $validated = [];
  $cv = 0;
  for ($i=0; $i < $countR; $i++) {
    if($datas['account_head'][$i] == null) continue;
    else if($datas['amount'][$i] == null) continue;

    $validated['account_head'][$cv] = $datas['account_head'][$i];
    $validated['description'][$cv] = $datas['description'][$i];
    $validated['amount'][$cv] = $datas['amount'][$i];
    $cv++;
  }

  return $validated;
}

Вывод

// http://127.0.0.1:8000/expenditure/add
{
  "account_head": [
    "5"
  ],
  "description": [
    null
  ],
  "amount": [
    "5000"
  ]
}

person Anish Silwal    schedule 03.09.2018    source источник
comment
Попробуйте так, для одного массива вы можете использовать его рекурсивно, проверьте это на рекурсивность   -  person Niklesh Raut    schedule 03.09.2018
comment
@ C2486 Я не просто хочу удалить нулевые значения. На самом деле я хочу, чтобы применялись некоторые правила проверки laravel, такие как required_with. И мне бы очень хотелось, чтобы решение было основано на laravel, если это возможно.   -  person Anish Silwal    schedule 03.09.2018
comment
то вы можете сопоставить его как 'amount.0' => 'required_with:account_head.0', 'amount.1' => 'required_with:account_head.1'   -  person Niklesh Raut    schedule 03.09.2018
comment
поправьте меня, если я ошибаюсь, но 'amount.*' => 'required_with:account_head.*' не должен этого делать.   -  person Anish Silwal    schedule 03.09.2018
comment
Да, это сойдет, но для всех. Можете ли вы добавить свое ручное решение?   -  person Niklesh Raut    schedule 03.09.2018
comment
@ C2486 я добавил свое решение.   -  person Anish Silwal    schedule 03.09.2018


Ответы (1)


Насколько я понимаю вашу проблему, следующий код решит вашу проблему.

public function store(Request $req)
{
  $validator = Validator::make($req->except(['account_head.null', 'description.null', 'amount.null']), [
    'date' => 'required',
    'account_head.*' => 'required',
    'description.*' => 'nullable',
    'amount.*' => 'required_with:account_head.*'
  ]);

  if ($validator->fails()) {
     // Do Whatever you wants here.
     // return redirect()->back()->withErrors($validator)->withInput();
  }
}

Вместо перенаправления обратно с ошибками вы можете выполнять любую задачу без перенаправления.

person puncoz    schedule 03.09.2018
comment
Все еще не дает моего ответа, как мне получить только данные, которые проходят проверку $validator->valid();, похоже, не работают. - person Anish Silwal; 04.09.2018
comment
даже это не должно быть проблемой, вы можете получить, какие атрибуты не сработали, из объекта $valiator. С этой информацией вы можете делать все, что захотите. Найдя различия в ваших атрибутах и ​​атрибутах с ошибками, вы можете получить желаемые атрибуты прохождения проверки. - person puncoz; 05.09.2018