Я создал класс промежуточного программного обеспечения с именем PathParser, который запускается по каждому запросу. Цель состоит в том, чтобы обрабатывать запросы для «URL-адресов тщеславия», которые мы разрешили пользователям создавать в нашем пред-Laravel php-приложении. Например: Пользователь создал путь URL, например: http://example.com/i-love-this-place
Что такое PathParser, это проверить на 404 ответа, а затем посмотреть, соответствует ли путь URL одному из наших старых путей тщеславия. Как это:
class PathParser
{
public function handle($request, Closure $next, $guard = null)
{
$next_response = $next($request);
$status_code = $next_response->getStatusCode();
if ($status_code === 404) {
$script_url = $request->server("SCRIPT_URL");
$vanity_controller = new VanityController();
$found_vanity_id = Search::findVanityPath($script_url);
if (!empty($found_vanity_id)) {
$next_response = response()->make($vanity_controller->one($found_vanity_id));
}
}
return $next_response;
}
}
Предположим следующее:
Пользователь никогда не создал URL путь, который будет конфликтовать с любым маршрутом
Я должен поддержать ряд существующих (pre-Laravel) URL-адреса тщеславия, которые находятся в дикой природе - отправляются в социальные сети и т. д.
В Kernel.php я следующее:
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\PathParser::class,
//\Illuminate\Session\Middleware\StartSession::class,
//\Illuminate\View\Middleware\ShareErrorsFromSession::class,
];
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
В $ промежуточного массива я попытался добавил StartSession и ShareErrorsFromSession (раскомментировав 2 строки выше), и это работает частично. Но с двумя основных проблемами:
- Auth :: пользователь имеет нулевое значение, даже для запросов к тщеславию путям по зарегистрированным пользователям
- $ ошибок больше не получают заполняются по форме представления (например, на страницы регистрации и входа в систему), когда пользователь отправляет неверную/недействительную информацию
Есть ли способ проверить маршрут по всем запросам и получить аутентифицированный пользователь, также сохраняя ошибки $?
У меня такое чувство, что я недостаточно понимаю жизненный цикл запроса, чтобы добиться успеха. Но может быть, есть способ?
Если это не возможно, чтобы делать то, что мне требуется, а затем использовать 302 перенаправления на стандартизированную приставке пути (например, как http://example.com/тщеславия/я-любовь-это место) является прекрасным решением. Но я надеюсь, что есть еще один способ.
Есть причина, вы не можете добавьте свой 'PathParser' в конец вашей промежуточной группы' web'? – patricus
Когда я помещал PathParser в массив промежуточного программного обеспечения в Интернете, любой запрос «пути суеты» идет прямо на встроенную страницу 404 Laravel и полностью обходит PathParser. На самом деле, структура даже не создает экземпляр PathParser - я могу поместить в нее плохой синтаксис и сохранить его, и нет никакого исключения, просто до 404. Но когда я нахожу подходящий маршрут, появляется это синтаксическое исключение. И, возможно, это дает нам подсказку - я имею в виду, возможно, есть способ обойти автоматическую обработку 404 Laravel (что может привести к решению)? – udog
Ах, да, это имеет смысл. Согласование маршрута выполняется до того, как применяется промежуточное ПО маршрута, поэтому исключение «NotFoundHttpException» будет выбрано до того, как ваше промежуточное программное обеспечение будет выполнено. – patricus