web-dev-qa-db-fra.com

Afficher une page 404 si la route n’a pas été trouvée dans Laravel 5.1

J'essaie de montrer que la page 404 n'est pas trouvée si un itinéraire n'est pas trouvé. J'ai suivi de nombreux tutoriels, mais cela ne fonctionne pas . J'ai 404.blade.php dans \laravel\resources\views\errors

Aussi dans handler.php

public function render($request, Exception $e)
{
    if ($e instanceof TokenMismatchException) {
        // redirect to form an example of how i handle mine
        return redirect($request->fullUrl())->with(
            'csrf_error',
            "Opps! Seems you couldn't submit form for a longtime. Please try again"
        );
    }

    /*if ($e instanceof CustomException) {
        return response()->view('errors.404', [], 500);
    }*/

    if ($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException)
        return response(view('error.404'), 404);

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

Si je saisis une URL incorrecte dans le navigateur, une page vierge est renvoyée. j'ai 

'debug' => env('APP_DEBUG', true),

dans app.php.

Quelqu'un peut-il m'aider à afficher une page 404 si aucun itinéraire n'est trouvé? Je vous remercie.

17
vision

J'ai reçu 500 erreurs au lieu de 404 erreurs. J'ai résolu le problème comme ceci:

Dans le fichier app/Exceptions/Handler.php, il existe une fonction render .

Remplacez la fonction par cette fonction:

public function render($request, Exception $e)
{
    if ($this->isHttpException($e)) {
        switch ($e->getStatusCode()) {

            // not authorized
            case '403':
                return \Response::view('errors.403',array(),403);
                break;

            // not found
            case '404':
                return \Response::view('errors.404',array(),404);
                break;

            // internal error
            case '500':
                return \Response::view('errors.500',array(),500);
                break;

            default:
                return $this->renderHttpException($e);
                break;
        }
    } else {
        return parent::render($request, $e);
    }
}

Vous pouvez ensuite utiliser les vues que vous enregistrez dans views/errors/404.blade.php, etc.

21
Pim

@ testeur.Votre problème a déjà été résolu, essayez la commande ci-dessous dans composer:

php artisan view:clear

Ensuite, essayez à nouveau avec une URL inconnue. Parce que j'ai également fait face à la même erreur avant.

5
user4294557

 enter image description here > La méthode abort lève immédiatement une exception qui sera rendue par le gestionnaire d'exceptions. Vous pouvez éventuellement fournir le texte de la réponse:

abort(403, 'Unauthorized action.');

votre app_debug est-il défini sur true? Si tel est le cas, Laravel émettra l'erreur avec backtrace à des fins de débogage. Si vous définissez la valeur sur false, Laravel affichera la page 404 par défaut dans le dossier des erreurs. Cela étant dit, vous pouvez choisir d’abandonner à tout moment. au niveau du contrôleur ou de la route, c'est à vous de décider. 

c'est à dire 

Route::get('/page/not/found',function($closure){
  // second parameter is optional. 
  abort(404,'Page not found');
  abort(403); 
});
3
mdamia

Vous n'avez pas besoin de vérifier le type d'erreur et de restituer manuellement la vue 404. Laravel sait déjà rendre la vue avec le code d'erreur HTTP renvoyé (404 = resources/views/errors/404.blade.php). Débarrassez-vous de la vérification supplémentaire et cela devrait fonctionner correctement.

public function render($request, Exception $e)
{
    if ($e instanceof TokenMismatchException) {
        // redirect to form an example of how i handle mine
        return redirect($request->fullUrl())->with(
            'csrf_error',
            "Opps! Seems you couldn't submit form for a longtime. Please try again"
        );
    }

    return parent::render($request, $e);
}
1
patricus

J'utilise ce qui suit dans app/Exceptions/Handler.php (Laravel 5.2):

/**
 * Render an exception into an HTTP response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $e
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $e)
{
    if ($e instanceof \ReflectionException OR $e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) //Si la ruta no existe, mostar view 404.
        return response(view('errors.404'), 404);
    return parent::render($request, $e);
}

Et cela ressemble à ceci: img

1
Shinseiki86

Dans Apache, vous pourriez être en mesure de placer ce code dans un fichier .htaccess dans votre répertoire principal et de vous assurer que vous modifiez la directive AllowOverride en un fichier httpd confg

ErrorDocument 404 the\path\to\404.blade.php
0
Mohammed Elhag