Задать вопрос
@nikilex

Как кастомизировать ошибки валидации laravel 7 через Requests для API?

Здравствуйте, подскажите, пожалуйста, как можно кастомизировать ошибки валидации для ответа из API через Requests.
Сейчас у меня есть файл Resources
<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class Task extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id'          => $this->id,
            'title'       => $this->title,
            'description' => $this->description,
            'estimate'    => $this->estimate,
            'status'      => $this->status,
            'created_at'  => $this->created_at,
            'updated_at'  => $this->updated_at,
        ];
    }
}

Файл Requests с правилами валидации и методом withValidator, который кастомизирует мои ошибки, но при успешном прохождении валидации выводит JSON с теми же полями которые я пытаюсь кастомизировать, но пустыми, а хотелось бы выполнить код в контроллере и добавлять в бд данные.
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class TaskRequest extends FormRequest
{
    public function rules()
    {
        return [
            'Title'       => 'required|string',
            'Description' => 'required|string',
        ];
    }

    public function withValidator($validator)
    {
        $validator->after(function ($validator) {
            $fields = [
                'Title'       => $validator->errors()->first('Title'),
                'Description' => $validator->errors()->first('Description')
            ];
            $validator->errors()->add('fields', $fields);
        });
    }
}

Файл контроллера
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\TaskRequest;
use App\Task;
use App\Http\Resources\Task as TaskResources;

class TaskController extends Controller
{
    public function store(TaskRequest $request)
    {
        $task = Task::create([
            'title'       => $request->Title,
            'description' => $request->Description,
            'backlog_id'  => 1,
            'status'      => 'opened',
        ]);

        $json = [
            'id' => 'TASK-'.$task->id
        ];

        return response()->json($json, 201);
    }
}

Файл Handler.php

<?php

namespace App\Exceptions;

use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
use Illuminate\Validation\ValidationException;

class Handler extends ExceptionHandler
{
    public function render($request, Throwable $exception)
    {
        if ($request->ajax() || $request->wantsJson())
        {
            // если это не ошибка валидации, то пишем сообщение, полученное из экземпляра исключения
            $message = [$exception->getMessage()];

            // если ошибка валидации
            if($exception instanceof ValidationException) {
                $message = $exception->errors();
            }

            $json = [
                'Errors' => [
                    'Fields' => isset($message['fields']) ? $message['fields'] : '',
                    'Global' => isset($message['global']) ? $message['global'] : ''
                ],
            ];
            
            // возвращаем массив ошибок
            return response()->json($json, 400);
        }

        return parent::render($request, $exception);
    }
}

Роут
Route::apiResources([
    '/tasks'    => 'TaskController',
]);

Какими еще можно методами воспользоваться для кастомизирования ошибок валидации?
  • Вопрос задан
  • 300 просмотров
Подписаться 1 Простой 6 комментариев
Пригласить эксперта
Ответы на вопрос 1
Alex_Wells
@Alex_Wells
PHP/Kotlin
Можно, но не нужно. Задача фронтэнда, там и решайте это.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы