2015-05-14 3 views

ответ

16

Ошибки обрабатываются в пределах App\Exceptions\Handler. Чтобы отобразить страницу 404 изменить render() метод для этого:

public function render($request, Exception $e) 
{ 
    if($e instanceof NotFoundHttpException){ 
     return response(view('errors.404'), 404); 
    } 
    return parent::render($request, $e); 
} 

и добавить в начало файла handler.php:

use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 

Edit: Как @YiJiang указывает, ответ должен не только возвращать представление 404, но также содержать правильный код состояния. Поэтому view() должен быть обернут в код response(), переданный в 404 в качестве кода состояния. Как в отредактированном коде выше.

+3

'использовать Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException;', возможно, потребуется добавить, так как он находится в другом пространстве имен. (Комментарий от [Carlo V] (http://stackoverflow.com/users/1025467/carlo-v)) –

+2

Это проблематично, потому что ваш ответ не будет содержать правильный код состояния HTTP. Документация Lumen обращается к этому, но это также неправильно, потому что оно скопировано из Laravel (у класса 'ResponseFactory' нет метода' view', который он делает в Laravel). Я закончил с ответом return (view («errors. $ Status») -> render(), $ status); ' –

+0

Спасибо @YiJiang, вы потрясающий! – nXu

0

Это не работает для меня, но я получил его работать:

if($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) { 
    return view('errors.404'); 
} 

Вы также можете добавить

http_response_code(404) 

сказать поисковым системам о состоянии страницы ,

7

The answer by lukasgeiterявляется почти правильно, но ответ сделал с функцией view всегда будет выполнять код состояния 200 HTTP, который является проблематичным для поисковых роботов или любого пользовательского агента, который опирается на него.

В Lumen documentation пытается решить эту проблему, но код дается не работает, потому что он копируется из Laravel, и урезанная версия люмена из ResponseFactory класса отсутствует метод view.

Это код, который я использую в настоящее время.

use Symfony\Component\HttpKernel\Exception\HttpException; 

[...] 

public function render($request, Exception $e) 
{ 
    if ($e instanceof HttpException) { 
     $status = $e->getStatusCode(); 

     if (view()->exists("errors.$status")) { 
      return response(view("errors.$status"), $status); 
     } 
    } 

    if (env('APP_DEBUG')) { 
     return parent::render($request, $e); 
    } else { 
     return response(view("errors.500"), 500); 
    } 
} 

Это предполагает, что вы имеете ваши ошибки хранятся в каталоге errors под вашими взглядами.

+1

Это прекрасно, спасибо –

Смежные вопросы