0

Laravel 5.2 を使用し、ミドルウェアを使用して、ディスパッチされる前にリクエストの URI から特定の部分を削除する必要があります。より具体的には、「http://somewebsite.com/en/company/about」のような URL で、「/en/」の部分を削除したいと考えています。

これは私がやっている方法です:

...

class LanguageMiddleware
{
    public function handle($request, Closure $next)
    {

        //echo("ORIGINAL PATH: " . $request->path());  //notice this line


        //duplicate the request
        $dupRequest = $request->duplicate();

        //get the language part
        $lang = $dupRequest->segment(1);

        //set the lang in the session
        $_SESSION['lang'] = $lang;

        //now remove the language part from the URI
        $newpath = str_replace($lang, '', $dupRequest->path());

        //set the new URI
        $request->server->set('REQUEST_URI', $newpath);


        echo("FINAL PATH: " . $request->path());
        echo("LANGUAGE: " . $lang);


        $response = $next($request);
        return $response;

    }//end function

}//end class

このコードは正常に動作しています。元の URI が「en/company/about」の場合、結果の URI は実際には「company/about」です。私の問題はこれです: ORIGINAL PATH をエコーする行がコメントされていることに注意してください (8 行目)。これは意図的に行われます。この行のコメントを外すと、コードは機能しません。元の URI が「en/company/about」の場合、結果の URI は「en/company/about」のままです。

これから 2 つの結論に達することができます: リクエストを操作する前に出力を送信することが原因である (テスト済み - これは事実ではありません) か、または $request->path() メソッドを呼び出して URI を取得することが関係しています。これ。もちろん、本番環境ではURIをエコーする必要はありませんが、これはデバッグのみを目的としていますが、なぜこれが起こっているのかを知る必要があります. リクエストの URI だけを取得したい。ここで何が欠けていますか?

補足: コードは、この投稿に対する最初の回答に由来します: https://laracasts.com/discuss/channels/general-discussion/l5-whats-the-proper-way-to-create-new-request-in-middleware ?ページ=1

4

1 に答える 1

1

行番号 8 が出力を操作しているとは思いません。laravel のコード
から のpath()メソッドは次のとおりです。

public function path()
    {
        $pattern = trim($this->getPathInfo(), '/');
        return $pattern == '' ? '/' : $pattern;
    }

ご覧のとおりpathInfo、リクエスト自体を編集せずに抽出するだけです。

于 2016-08-05T14:03:32.140 に答える