Используя 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 запроса. Что мне здесь не хватает?
Sidenote: Код возник из первого ответа на этот пост:
https://laracasts.com/discuss/channels/general-discussion/l5-whats-the-proper-way-to-create-new-request-in-middleware?page=1
Я не думаю, что строка № 8 манипулирует вашим выводом.
Здесь path()
метод из код ларавеллы:
public function path()
{
$pattern = trim($this->getPathInfo(), '/');
return $pattern == '' ? '/' : $pattern;
}
Как вы можете видеть, это просто извлечение pathInfo
без редактирования самого запроса.
Других решений пока нет …