Tratamento de exceções no Laravel 9
Este artigo foi baseado no
https://ribafs.github.io/backend/framework/laravel/crud-generator/
Temos dois CRUDs, um de posts e outro de comments, relacionados pelo campo post_id em comments.
php artisan serve
Acesse
http://127.0.0.1:8000/comments
Caso tente adicionar um comentário com user_id que não existe.
Verá o erro
Illuminate \ Database \ QueryException
PHP 8.1.2
9.35.1
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`laravel`.`comments`, CONSTRAINT `comments_post_id_foreign` FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`))
insert into `comments` (`body`, `post_id`, `updated_at`, `created_at`) values (teste, 150, 2022-10-13 21:31:40, 2022-10-13 21:31:40)
Não é boa ideia mandar uma mensagem destas para um usuário usando o sistema em produção. Idealmente devemos interceptar o erro com um try catch e mandar uma mensagem nossa e em português para o usuário.
Para melhorar precisamos tomar duas pvovidências: capturar e tratar o erro no controller CommentController e adicionar uma mensagem na view comments/index
No controller
Adicionamos ao início
use Exception;
Mudamos o método store() para:
public function store(Request $request)
{
$requestData = $request->all();
try {
Comment::create($requestData);
return redirect('comments')->with('flash_message', 'Comments created!');
} catch (Exception $e) {
if($e->getCode() == 23000){
return redirect('comments')->with('danger_message', 'Post não encontrado!');
}
}
}
Adicionamos para a view comments/index.blade.php, logo abaixo do Add New, por exemplo. É bom que seja no início da view.
@if ($message = Session::get('danger_message'))
<div class="alert alert-danger">
<p>{{ $message }}</p>
</div>
@endif
@if ($message = Session::get('flash_message'))
<div class="alert alert-success">
<p>{{ $message }}</p>
</div>
@endif
Assim, quando o usuário cadastrar um comentário corretamente receberá uma mensagem com fundo verde. E quando tentar cadastrar um comentário com um post_id que não existe ele será avisado com uma mensagem em fundo vermelho.
Referência
https://www.itsolutionstuff.com/post/laravel-9-exception-handling-example-tutorialexample.html