2

すべてのリクエストで実行される 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;
    }
}

次のことを前提とします。

  1. ユーザーは、ルートと競合する URL パスを作成したことがありません

  2. 私は、ソーシャル メディアなどに投稿された、世の中に出回っている多数の既存の (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 リダイレクトの使用が適切な解決策です。でも、別の手段があることを願っています。

4

1 に答える 1

1

いくつかの提案:

auth/sessions/etc が必要ない場合はSymfony\Component\HttpKernel\Exception\NotFoundHttpException、アプリケーションの例外ハンドラ内で例外を処理できます。

で、メソッドを次のようapp/Exceptions/Handler.phpに変更します。render()

public function render($request, Exception $e)
{
    if ($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) {
        // your code that returns a Response
    }

    return parent::render($request, Exception $e);
}

auth/sessions/etc が必要な場合は、ルート ファイルの最後に「キャッチオール」ルートを作成することをお勧めします。たとえば、routes/web.phpファイルの最後の行に次のように入力します。

Route::any('{catchall}', 'VanityController@handle')->where('catchall', '(.*)');

次に、 内にVanityControllerhandle次のようなメソッドがあります。

public function handle(Request $request, $url)
{
    // logic to search and render your vanity page for $url

    // if no vanity page was found:
    throw new \Symfony\Component\HttpKernel\Exception\NotFoundHttpException();
}
于 2016-12-24T06:02:44.563 に答える