Я создал класс промежуточного программного обеспечения с именем PathParser, который запускается при каждом запросе. Цель состоит в том, чтобы обрабатывать запросы на «пути URL-адресов тщеславия», которые мы разрешили пользователям создавать в нашем ванильном PHP-приложении до Laravel. Например: пользователь создал 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, который конфликтует с каким-либо маршрутом.
Я должен поддерживать ряд существующих (до 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,
],
];
В массиве $middleware я попробовал добавить StartSession и ShareErrorsFromSession (раскомментировав 2 строки выше), и это частично работает. Но с двумя основными проблемами:
- Auth::user имеет значение null, даже для запросов, сделанных к тщеславным путям вошедшими в систему пользователями.
- $errors больше не заполняется при отправке формы (например, на страницах регистрации и входа), когда пользователь отправляет неверную/недействительную информацию.
Есть ли способ как проверить маршрут для всех запросов, так и получить доступ к аутентифицированному пользователю, а также сохранить $errors?
У меня такое чувство, что я недостаточно хорошо понимаю жизненный цикл запроса, чтобы добиться успеха. Но может есть способ?
Если невозможно сделать то, что мне нужно, используйте перенаправление 302 на стандартизированный путь с префиксом (например, http://example.com/vanity/i-love-this-place) — прекрасное решение. Но я надеюсь, что есть другое средство.
PathParser
в конец группы промежуточного программного обеспеченияweb
? - person patricus   schedule 24.12.2016NotFoundHttpException
выдается до того, как ваше промежуточное программное обеспечение будет выполнено. - person patricus   schedule 24.12.2016