404 personalizado en Laravel 4.2 con Diseño

Mi página de los usos globales de diseño y hay muchos puntos de vista con los propios controladores que están utilizando este diseño. La vista llamada de controlador de acción como esta:

class NewsController extends BaseController {

  protected $layout = 'layouts.master';

  public function index()
  {
    $news = News::getNewsAll();

    $this->layout->content = View::make('news.index', array(
        'news' => $news
    ));
  }
}

Me gustaría crear una página 404 de la misma manera porque tengo el normal, diseño de página para anidada 404 personalizado de diseño. Es posible de alguna manera? El problema es que no puedo configurar el código de estado HTTP para 404 de la controladora, así que es sólo un soft-404 todavía. Sé que la forma correcta sería enviar el Response::view('errors.404', array(), 404) de filter.php en App::missing() pero no puedo configurar el diseño no sólo de la opinión de que no es suficiente. O estoy equivocado y es posible de alguna manera?

Gracias!

Actualización:
He creado un Gist para este problema con los archivos, lo que uso en el proyecto. Tal vez ayuda más a entender mi estado actual.

  • ¿Quiere mostrar otro punto de vista si $news está vacía?
  • Ya tenemos una conversación más larga aquí, pero todavía no hay solución.
  • Response::view('layouts.errors', ['content' => View::make('errors.404')], 404) va a utilizar un archivo de diseño y tienen la $content conjunto de variables para el contenido de errors.404.
  • Lanza Call to undefined function view() de error. Si lo cambio a Response::view('layouts.master', ['content' => View::make('errors.missing')], 404);, a continuación, el error será Error in exception handler: Undefined variable: shared (View:master.blade.php)
InformationsquelleAutor Sas Sam | 2014-10-21

7 Kommentare

  1. 7

    Este es mi enfoque. Sólo agregue el código siguiente a /app/start/global.php archivo

    App::missing(function($exception)
    {
        $layout = \View::make('layouts.error');
        $layout->content = \View::make('views.errors.404');
        return Response::make($layout, 404);
    });
  2. 5

    Puede hacer el truco mediante la adición de algo como esto en global.php y crear la necesaria error vistas.

    App::error(function(Exception $exception, $code)
    {
        $pathInfo = Request::getPathInfo();
        $message = $exception->getMessage() ?: 'Exception';
        Log::error("$code - $message @ $pathInfo\r\n$exception");
    
        if (Config::get('app.debug')) {
            return;
        }
    
        switch ($code)
        {
            case 403:
                return Response::view( 'error/403', compact('message'), 403);
    
            case 500:
                return Response::view('error/500', compact('message'), 500);
    
            default:
                return Response::view('error/404', compact('message'), $code);
        }
    });

    También puede comprobar algunos laravel-starter-kit de paquetes disponibles alrededor y comprobar cómo hacer materias como eso. Aquí está mi versión de laravel-admin-plantilla

    • Gracias, pero la solución (como muchos otros) no es mediante el diseño de 404. Funciona, pero no me gusta cómo me quiere. Tengo un layout (encabezado, pie de página, etc. en diseño para todas las vistas), las cosas en BaseController y quiero tirar la página 404 404 código de Estado HTTP de ErrorController como he mostrado anteriormente en mi Esencia ejemplo.
  3. 1

    Yo no te puedo decir si este es el mejor enfoque o consideradas como las mejores de práctica, pero como yo estaba frustrado y encontrar una solución alternativa mediante el uso de la callAction método de Iluminar\Routing\Controlador.

    app/start/global.php

    App::missing(function($exception)
    {
        return App::make("ErrorController")->callAction("missing", []);
    });

    app/controllers/ErrorController.php

    <?php
    
    class ErrorController extends BaseController {
    
        protected $layout = 'layouts.master';
    
        public function missing()
        {
            $this->layout->content = View::make('errors.missing');
        }
    }

    Espero que ayude!

  4. 1

    Sé que llego tarde a la fiesta, pero como esta pregunta sigue sin respuesta y se ubica en niveles relativamente altos en los resultados de la búsqueda para la consulta, «Laravel 404 Error en el controlador de excepción». Sólo porque de este MODO la página sigue siendo un problema común y no hay ninguna solución marcado quería añadir más información y otra posible solución para muchos usuarios.

    Cuando siga los métodos que se ofrecen aquí y en otros lugares y el uso de la app/start/global.php archivo para implementar la Aplicación:error() debe tenerse en cuenta que la base_controller se crea una instancia DESPUÉS de este archivo, de modo que ninguna de las variables que podría estar pasando en su normal ver los archivos (por ejemplo. $usuario) no se establece. Si cualquiera de estas variables, se hace referencia en la plantilla que está extendiendo, obtendrá el error.

    Usted puede extender su plantilla si tienes que revisar el ver los archivos, comprobar si las variables son establecidas con isset() y manejar la falsa condición de los valores de configuración predeterminados.

    Por ejemplo;

    @yield('styles')
    <style type="text/css">
    body{
        background-color: {{ $user->settings->bg_color }};
    }
    </style>

    El de arriba va a tirar el error porque no hay $objeto de usuario en el momento en que este se ejecuta. La costumbre de controlador de excepción iba a dar más detalles, pero que la movilidad de la necesidad de que realmente muestra la página de error 404 para obtener casi nada para el camino. Sin embargo, si utiliza isset() o vacío() se puede acomodar el caso.

    <style type="text/css">
    body{
        @if(isset($user))
            background-color: {{ $user->settings->bg_color }};
        @else
            background-color: #FFCCFF;
        @endif
    }
    </style>

    Esta simple solución no ayuda si usted tiene un número de referencias en el nivel superior de diseño o archivo de encabezado. Usted podría necesitar un cambio en su @extiende desde el núcleo de su diseño, a uno personalizado. Por ejemplo. views/layouts/errors.blade.php.

    A continuación, en su 404.blade.php usted podría hacer algo como esto

    @extends('layouts.errors')

    Y crear views/layouts/errors.blade.php con nuevas cabeceras no dependen de $usuario (o lo que sea).

    Espero que ayude.

  5. 1

    Me rasqué la cabeza en esto un poco, aquí está la solución:

    En app/start/global.php:

    App::error(function(Exception $exception, $code) {
        if ($exception instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) {
          Log::error('NotFoundHttpException Route: ' . Request::url() );
        }
    
        Log::error($exception);
    
        //HTML output on staging and production only
        if (!Config::get('app.debug'))
            return App::make("ErrorsController")->callAction("error", ['code'=>$code]);
    });

    (NOTA: El fragmento anterior muestra estas páginas de error personalizadas sólo en entornos donde el modo de depuración es cierto. Establezca el modo de depuración en los distintos entornos en los correspondientes app.php archivo: http://laravel.com/docs/4.2/configuration#environment-configuration)

    En app/controllers/ErrorsController.php:

    protected $layout = "layouts.main";
    
    /*
    |--------------------------------------------------------------------------
    | Errors Controller
    |--------------------------------------------------------------------------
    */
    
    public function error($code) {
        switch ($code) {
            case 404:
                $this->layout->content = View::make('errors.404');
            break;
    
            default:
                $this->layout->content = View::make('errors.500');
            break;
        }
    }

    }

    (NOTA: protected $layout = «diseños.principal»; se refiere a mi maestro de diseño, lo que se denomina «principal». Su maestro de diseño puede ser llamado algo más, como el ‘maestro’.)

    Por último, crear app/views/errors/404.blade.php y app/views/errors/500.blade.php y colocar cualquier código HTML que desee para las páginas de error allí. Automáticamente será envuelto en los diseños.principal!

    Páginas que faltan y 500 internal error ahora automáticamente visualización de páginas de error personalizadas, con el diseño. Usted puede manualmente invocar a una página de error de cualquier controlador llamando al:
    return App::make("ErrorsController")->callAction("error", ['code'=>404]); (reemplazar 404 con cualquier código de error que desea)

  6. 0

    OK, esta es la forma en que usted puede conseguir lo que usted está después (modificar según sea necesario).

    App::error(function(Symfony\Component\HttpKernel\Exception\NotFoundHttpException $exception, $code) use ($path, $referer, $ip)
    {
        //Log the exception
        Log::error($exception);
    
        //This is a custom model that logs the 404 in the database (so I can manage redirects etc within my app)
        ErrorPage::create(['destination_page' => $path, 'referer' => $referer, 'ip' => $ip]);
    
        //Return a response for the master layout
        $layout = Response::view('layouts.frontend');
    
        //Instantiate your error controller and run the required action/method, make sure to return a response from the action
        $view = App::make('Namespace\Controllers\Frontend\ErrorsController')->notFound();
    
        //Merge data from both views from the responses into a single array
        $data = array_merge($layout->original->getData(), $view->original->getData());
    
        //There appears to be a bug (at least in Laravel 4.2.11) where,
        //the response will always return a 200 HTTP status code, so
        //set the status code here.
        http_response_code(404);
    
        //Return your custom 404 error response view and pass the required data and status code.
        //Make sure your error view extends your master layout.
        return Response::view('404', $data, 404);
    });

    Así que, básicamente lo que estamos haciendo aquí es devolver una respuesta para el master de diseño y el custom 404/vista de error, a continuación, recuperar los datos desde el punto de vista de los objetos de esas respuestas, la combinación de los datos en una única matriz y, a continuación, devuelve una respuesta y pasar por nuestra 404 personalizado/vista de error, los datos y el código de estado HTTP.

    NOTA: No parece ser un error (al menos en Laravel 4.2.11) donde la respuesta siempre va a devolver un código de estado HTTP 200, independientemente de lo que pase a ver() o(). Con eso dicho usted necesita para configurar manualmente el código de respuesta utilizando http_response_code(404).

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea