Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Здравствуйте!
Использую laravel + Vue с локализацией на стороне клиента. Валиадция формы на обеих сторонах. И вот мне нужно, чтобы стандартный валидатор Laravel возвращал не сообщение, а id ошибки, чтобы я потом по этому id на стороне клиента получил ошибку на нужном языке.
Подскажите, какие общепринятые варианты решения такой задачи?
Не в сети
Лучше валидацию проводить в файлах Request.
Для этого:
1 вызываем команду
php artisan make:request NameRequest
После это в app\HTTP появится папка Request с файлом NameRequest
2. Для api, чтобы ответ ошибки возвращался в json формате, добавляем в данную папку файл ApiFormRequest.php
<?php
namespace App\Http\Requests;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Http\JsonResponse;
use Illuminate\Validation\ValidationException;
use Illuminate\Foundation\Http\FormRequest;
abstract class ApiFormRequest extends FormRequest
{
protected function failedValidation(Validator $validator)
{
// все ошибки валидации
$errors = (new ValidationException($validator))->errors();
throw new HttpResponseException(response()->json([
'errors' => $errors
], JsonResponse::HTTP_UNPROCESSABLE_ENTITY));
}
abstract public function authorize();
abstract public function rules();
}
3. В файле NameRequest меняем эти строки http://prntscr.com/rzoluk на эти http://prntscr.com/rzomjy
Здесь http://prntscr.com/rzon19 меняем на true. В блоке rules прописываем правила валидации http://prntscr.com/rzonwd . При необходимости, прописываем варианты ответов http://prntscr.com/rzopxt
4. Теперь в нужном контроллере вызывай данный реквест http://prntscr.com/rzorzp
5. Теперь на стороне клиента ты сможешь получить ошибку в json формате http://prntscr.com/rzouel, с которой сможешь сделать, что пожелаешь нужным
Вот вариант как получить сообщение об ошибке во Vue http://prntscr.com/rzow6q
Не в сети
Согласен с предыдущим автором. Только мой вариант абстрактного класса выглядит чуть проще
<?php
namespace App\Http\Requests\Api;
use Illuminate\Http\JsonResponse;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Validation\ValidationException;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Foundation\Http\FormRequest as LaravelFormRequest;
abstract class FormRequest extends LaravelFormRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
abstract public function rules();
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
abstract public function authorize();
/**
* @param Validator $validator
*/
protected function failedValidation(Validator $validator)
{
$errors = (new ValidationException($validator))->errors();
throw new HttpResponseException(
response()->json(['errors' => $errors], JsonResponse::HTTP_UNPROCESSABLE_ENTITY)
);
}
}
Сам класс валидации можно использовать под весь ресурс взависимости от типа запроса. Думаю это тоже будет полезным
class GroupRequest 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()
{
$rules = [
'name' => 'string|required|unique:groups',
'parent_id' => 'integer|nullable',
'status' => 'sometimes|in:1,0',
];
switch ( $this->getMethod() )
{
case 'POST':
return $rules;
case 'PUT':
return $rules;
case 'DELETE':
return [
'id' => 'required|integer|exists:groups,id',
];
}
}
}
Изменено Slavik (16.04.2020 20:35:45)
Не в сети
Страницы 1