Laravel - изменить маршрут в промежуточном программном обеспечении

Скажем, у меня есть такие URL-адреса:

example.com/en/
example.com/en/login
example.com/fr/login

Я хотел бы использовать промежуточное программное обеспечение для установки языка, а затем вернуть маршрут для обработки без языковой части. Таким образом, маршрутизатор получит / или /login без каких-либо языковых настроек.

public function handle(Request $request, Closure $next) {
        app()->setLocale($request->segment(1));
        // $request->server->set('REQUEST_URI', substr($_SERVER['REQUEST_URI'], 4));// not working

        return $next($request);
    }

person Jeremy Belolo    schedule 24.09.2020    source источник
comment
проверьте это laraveldaily.com/multi-language-routes-and-locales -с-авторизацией   -  person Kamlesh Paul    schedule 24.09.2020
comment
Спасибо, но мне это не поможет. Мне нужно иметь возможность обрабатывать это из промежуточного программного обеспечения, работающего для всего приложения, поскольку невозможно сделать то, что показано в вашей статье, например, для маршрутов, исходящих из jetstream.   -  person Jeremy Belolo    schedule 24.09.2020
comment
вам нужно будет использовать строку сеанса/куки/запроса, чтобы указать, какая локаль будет после перенаправления на URL-адрес без локали в пути   -  person lagbox    schedule 24.09.2020
comment
Неправильный. Если вы установите языковой стандарт с помощью setLocale, вы можете использовать его, даже если он не находится в файлах cookie или чем-то еще, приложение уже знает это.   -  person Jeremy Belolo    schedule 24.09.2020


Ответы (1)


Я бы предложил сохранить язык в сеансе и использовать промежуточное программное обеспечение для setLocale.

Рабочий пример

ПО промежуточного слоя SetLocale.php

public function handle($request, Closure $next)
{
    if (Session::has('language'))
    {
        App::setLocale(strtolower(Session::get('language')));
    }
    return $next($request);
}

Функция контроллера для установки языка для сеанса

 public function setLanguage(string $language)
{
    if (Session::has('language'))
    {
        Session::forget('language');
    }
    Session::put('language', $language);

    return redirect()->back();
}

Итак, теперь во всем, что происходит на веб-сайте, промежуточное программное обеспечение будет проверять язык и устанавливать его в соответствии с тем, что происходит в сеансе.

Также не забудьте указать промежуточное ПО в $middlewareGroups в app\Http\Kernel.php

Вы можете создать форму в любом месте на веб-сайте, чтобы пользователь мог выбрать предпочтительный язык с маршрутом к функции контроллера.

person Andrei Munteanu    schedule 24.09.2020
comment
Спасибо за попытку помочь, но я не пытаюсь использовать сеансы - я могу это сделать, конечно, но мне особенно нужно, чтобы локаль обрабатывалась в URL-адресе - и есть несколько URL-адресов, над которыми я не могу реально контролировать поэтому я не могу префикс их. - person Jeremy Belolo; 24.09.2020