Acabo de seguir algún tutorial y hasta el momento lo que hago es :

mi App/Exceptions/Handler.php

<?php
...
use Illuminate\Database\Eloquent\ModelNotFoundException;
...
public function render($request, Exception $e)
{
    if ($e instanceof ModelNotFoundException){
        abort(404);
    }
        return parent::render($request, $e);
}

y mi UsersController se parece a esto :

...
public function edit($id)
{
    $data = User::findOrFail($id);
    $roles = Role::where('title', '!=', 'Super Admin')->get();
    return View('admin.user.edit', compact(['data', 'roles']));
}
...

con el código anterior si me visita http://my.url/users/10/edit puedo obtener NotFoundHttpException in Application.php line 901:, sí, porque no hay ningún id de 10 en mi expediente, pero con User::find($id); puedo obtener la vista normal sin datos, ya que no hay id de 10 en mi registro.

Lo que quiero es mostrar por defecto 404, a continuación, redirigir a un sitio o devolver algo si no se encontró el registro con User::findOrFail($id); ? ¿Cómo puedo hacer eso ?

Gracias, cualquier ayuda es apreciada.

ps: .env APP_DEBUG = true

InformationsquelleAutor Dark Cyber | 2015-09-23

3 Comentarios

  1. 11

    Este hace lo que le pide. No hay necesidad de excepciones.

    public function edit($id)
    {
        $data = User::find($id);
        if ($data == null) {
            //User not found, show 404 or whatever you want to do
            //example:
            return View('admin.user.notFound', [], 404);
        } else {
            $roles = Role::where('title', '!=', 'Super Admin')->get();
            return View('admin.user.edit', compact(['data', 'roles']));
        }
    }

    Su controlador de excepción no es necesario tal y como es. Con respecto a Illuminate\Database\Eloquent\ModelNotFoundException:

    Si la excepción no está atrapado, un 404 HTTP de la respuesta se envía automáticamente al usuario, por lo que no es necesario escribir explícita cheques para volver 404 respuestas cuando se utiliza [findOrFail()].

    También, estoy bastante seguro de que usted consigue la página de excepción en lugar de 404 debido a que está en modo de depuración.

  2. 2

    findOrFail() es igual de find() función con una habilidad extra – a lanza el No Encontrar Excepciones

    A veces usted puede desear para lanzar una excepción si un modelo no se encuentra. Esto es particularmente útil en las rutas o los controladores. El findOrFail y firstOrFail métodos de recuperar el primer resultado de la consulta; sin embargo, si no se encuentra, un Iluminar\bases de datos\Elocuente\ModelNotFoundException será lanzado:

    $model = App\Flight::findOrFail(1);
    
    $model = App\Flight::where('legs', '>', 100)->firstOrFail();

    Si la excepción no está atrapado, un 404 HTTP de la respuesta se envía automáticamente al usuario. No es necesario escribir explícita cheques para volver 404 respuestas cuando el uso de estos métodos:

    Route::get('/api/flights/{id}', function ($id) {
        return App\Flight::findOrFail($id);
    });

    No es recomendable, pero Si aún así desea controlar esta excepción a nivel mundial, son los siguientes cambios como por su handle.php

    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $exception
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $exception)
    {
        if ($exception instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) {
    
            //redirect to errors.custom view page 
            return response()->view('errors.custom', [], 404);
        }
    
        return parent::render($request, $exception);
    }
  3. 0

    Adición tardía al tema anterior: Si usted quiere manejar la excepción de una API de backend y usted no quiere hacer la comprobación de un resultado vacío en cada método y volver a 400 solicitud incorrecta error de forma individual como este…

    public function open($ingredient_id){
        $ingredient = Ingredient::find($ingredient_id);
        if(!$ingredient){
            return response()->json(['error' => 1, 'message' => 'Unable to find Ingredient with ID '. $ingredient_id], 400);
        }
        return $ingredient;
    }

    Lugar de utilizar findOrFaily la captura de la excepción en app/Exceptions/Handler.php.

    public function render($request, Exception $exception)
    {
        if ($exception instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) {
            return response()->json(['error'=>1,'message'=> 'ModelNotFoundException handled for API' ], 400);
        }
        return parent::render($request, $exception);
    }

    Esto se verá así en sus Controladores:

    public function open($ingredient_id){
        return Ingredient::findOrFail($ingredient_id);
    }  

    que es mucho más limpio. Considere que usted tiene un montón de Modelos y un montón de Controladores.

Dejar respuesta

Please enter your comment!
Please enter your name here