murph
murph
Laravel
Comparte:

Laravel Api control errores

Hola a todos.
Estoy empezando a desarrollar con Laravel para crear una Api simple y me falla una cosa que seguramente sea una chorrada. A ver si alguien puede echarme un cable.
Imagen una petición GET para obtener los datos de un "cliente" concreto, donde se envíe el id del cliente en la petición. En el controller he hecho esto:
public function show(Client $client)
    {
        try
        {
            $client = Client::findOrFail($client);
            $data = [
                "status" => "success",
                "message" => "Correct request",
                "data" => [
                    "client" => $client
                ]   
            ];
            return response()->json($data, 200);
        }
        catch (ModelNotFoundException $e)
        {
            $data = [
                "status" => "error",
                "message" => "Invalid client id"
            ];
            return response()->json($data, 404);
        }
    }

¿Cuál es el problema? Que si el id de cliente existe en la base de datos está todo ok, no hay problema, se responde con los datos, pero mi problema es que no sé cómo hacer para que cuando se indique un id que no existe, la api pueda responder con un error code 404 y retorne lo que he puesto en el catch, que es un array con un status y mensaje.
Esto es lo que hace independientemente de lo que yo haga:
<img src="https://i.ibb.co/9mDTVqR/Captura-de-Pantalla-2023-04-08-a-las-18-57-18.jpg"/>

Creo que eso ocurre porque el controlador recibe directamente el parámetro en la función y ahí ya comprueba que no existe. Me gustaría ser yo quién responde con un error personalizado y no con toda esa información.
¿Alguna idea?
Gracias.
Saludos!
Ricardo
Ricardo (86 xp)
1
gssa
gssa (986 xp)
Hay varias formas de hacer lo que tu esperas, la primera y creo que es la ideal es como te lo compartio @Ricardo, creo que esa es la mejor opcion, sin embargo eso aplica para todas las respuestas de error, ahora si quieres una respuesta personalizada por servicio, no entenderia el porque, ya que es mucho trabajo dar mantenimiento, sin embargo se me ocurre lo siguiente:


use Illuminate\Database\QueryException;
public function show(int $client)
{
// recibe tu parametro como entero para que no exista el model binding
    try {
        $client = Client::findOrFail($client);
        $data = [
            "status" => "success",
            "message" => "Correct request",
            "data" => [
                "client" => $client
            ]
        ];
        return response()->json($data, 200);
    } catch (QueryException $e) {
        $data = [
            "status" => "error",
            "message" => "Invalid client id"
        ];
        return response()->json($data, 404);
    }
} 
Desde mi punto de vista esto no es productivo, debido a que tendras que realizar una personalizacion de cada servicio, que para dar mantenimiento no es viable, sin embargo es lo que solicitas