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