Laravel 5 - вызов $request-›path() в промежуточном программном обеспечении, заставляющий Laravel игнорировать изменения, внесенные в URI запроса?

Используя Laravel 5.2 и промежуточное ПО, мне нужно удалить определенную часть из URI запроса, прежде чем он будет отправлен. В частности, в URL вида "http://somewebsite.com/en/company/about. ", я хочу удалить из него часть "/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». Моя проблема заключается в следующем: обратите внимание, что строка, в которой я повторяю ИСХОДНЫЙ ПУТЬ, закомментирована (строка 8). Это делается специально. Если я раскомментирую эту строку, код не будет работать; когда исходный URI — «en/company/about», результирующий URI по-прежнему «en/company/about».

Из этого я могу сделать только два вывода: либо отправка вывода перед манипулированием запросом каким-то образом является виновником (проверено - это не так), либо вызов метода $request->path() для получения URI имеет какое-то отношение к это. Хотя в производственной среде мне, конечно, никогда не понадобится повторять URI, и хотя это только для целей отладки, мне все равно нужно знать, почему это происходит. Я только хочу получить URI запроса. Что мне здесь не хватает?

Примечание: код взят из первого ответа на этот пост: https://laracasts.com/discuss/channels/general-discussion/l5-whats-the-proper-way-to-create-new-request-in-middleware?page=1


person pazof    schedule 05.08.2016    source источник


Ответы (1)


Я не думаю, что строка №8 манипулирует вашим выводом.
Вот метод path() из код laravel:

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

Как видите, это просто извлечение pathInfo без редактирования самого запроса.

person jaysingkar    schedule 05.08.2016
comment
Я знаю, поэтому мне это кажется таким неловким. Как тогда может быть, что код отлично работает, когда эта строка закомментирована, но не работает, когда ее нет? - person pazof; 05.08.2016
comment
Я попытаюсь сделать то же самое со своей настройкой и дам вам знать - person jaysingkar; 05.08.2016