Как исключить все данные, которые не прошли валидацию? - PullRequest
0 голосов
/ 03 сентября 2018

Я хочу только данные, которые проходят проверку. И не нужно никаких ошибок или перенаправления с использованием 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"
  ]
}

1 Ответ

0 голосов
/ 03 сентября 2018

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

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();
  }
}

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

...