すべてのリクエストで実行される PathParser という名前のミドルウェア クラスを作成しました。目的は、Laravel 以前のバニラ PHP アプリでユーザーが作成できるようにした「バニティ URL パス」のリクエストを処理することです。例: ユーザーは次のような URL パスを作成しました: http://example.com/i-love-this-place
PathParser が行うことは、404 応答をチェックしてから、URL パスが古いバニティ パスの 1 つと一致するかどうかを確認することです。このような:
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 行のコメントを外します)。これは部分的に機能します。しかし、次の 2 つの大きな問題があります。
- Auth::user は、ログインしているユーザーによるバニティ パスへのリクエストに対しても null です
- ユーザーが間違った/無効な情報を送信したときに、フォームの送信 (登録ページやログイン ページなど) で $errors が入力されなくなりました
すべてのリクエストでルートをチェックし、認証されたユーザーを把握し、$errors を保持する方法はありますか?
リクエストのライフサイクルを十分に理解していないと感じています。しかし、おそらく方法はありますか?
私が必要とすることを行うことができない場合は、標準化されたプレフィックス付きパス ( http://example.com/ vanity /i-love-this-place など) への 302 リダイレクトの使用が適切な解決策です。でも、別の手段があることを願っています。