Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 05.04.2020 22:56:47

Валидация API

Здравствуйте!

Использую laravel + Vue с локализацией на стороне клиента. Валиадция формы на обеих сторонах. И вот мне нужно, чтобы стандартный валидатор Laravel возвращал не сообщение, а id ошибки, чтобы я потом по этому id на стороне клиента получил ошибку на нужном языке.

Подскажите, какие общепринятые варианты решения такой задачи?

Не в сети

#2 15.04.2020 12:26:55

Re: Валидация API

Лучше валидацию проводить в файлах 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

Не в сети

#3 16.04.2020 20:32:51

Re: Валидация API

Согласен с предыдущим автором. Только мой вариант абстрактного класса выглядит чуть проще

<?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)

Не в сети

Подвал раздела