Я понял это благодаря этой теме на github: https://github.com/laravel/framework/issues/17187, особенно комментарии ssddanbrown и DominusVilicus. Но главным образом [ssddanbrown's commit to Bookstack] [1] Я изменил только один файл app / Exceptions / Handler.php
Я добавил
use Illuminate\Http\Request;
use Illuminate\Pipeline\Pipeline;
перед объявлением класса. Создал следующий метод:
/**
* Load Session middleware then run the callback closure and return its result
*
* @param \Illuminate\Http\Request $request
* @param \Closure $callback
* @return \Illuminate\Http\Response
*/
protected function loadSessionMiddleware(Request $request, \Closure $callback)
{
$pipe = new Pipeline($this->container);
$middleware = [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
];
return $pipe->send($request)->through($middleware)->then($callback);
}
И изменил метод рендеринга следующим образом:
public function render($request, Exception $exception)
{
if (
// Only process non API requests' ...
$request->segment(1) !== 'api' &&
// ... HTTP exceptions with ...
$this->isHttpException($exception)
) {
$code = $exception->getStatusCode();
// ... codes between 400 and 599
if ($code >= 400 && $code < 600) {
return $this->loadSessionMiddleware(
$request,
function ($request) use ($exception, $code) {
// Load error names and descriptions from language files
$name = __('http-errors.' . $code . 'n');
$desc = __('http-errors.' . $code . 'd');
// Display the error page
return response()->view(
'errors.http',
compact('code', 'name', 'desc'),
$code
);
}
);
}
}
return parent::render($request, $exception);
Теперь после этого директивы блейдов @auth
и @guest
работают как положено в шаблоне,
. .
Примечание. Я использую один шаблон представления и языковые файлы для рендеринга нескольких страниц с ошибками, потому что я ожидаю, что мне придется локализовать мой проект, но содержимое вашей функции обратного вызова и вашего условия может быть немного проще, если вы толькохочу добавить промежуточное ПО на 404 страницы. Что еще более важно, эта часть кода на самом деле не полностью выполняет свою миссию, поскольку не все исключения, которые генерируют ответы HTTP-кода 400-599, являются экземплярами HTTPException, а именно: AuthorizationException и AuthenticationException.