【问题标题】:Laravel - change route in middlewareLaravel - 在中间件中更改路线
【发布时间】:2021-01-10 12:48:02
【问题描述】:

假设我有这种网址:

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);
    }

【问题讨论】:

  • 谢谢,但这对我没有帮助。我需要能够从中间件处理它,为整个应用程序工作,因为例如你的文章中显示的内容无法用于来自 jetstream 的路线。
  • 您将需要使用 session/cookie/query 字符串来指示在重定向到路径中没有语言环境的 URL 后的语言环境
  • 错了。如果您使用setLocale 设置语言环境,您可以使用它,即使它不在 cookie 或任何东西中,应用程序已经知道它。

标签: laravel middleware laravel-routing laravel-middleware laravel-8


【解决方案1】:

我建议将语言存储在会话中并使用中间件来设置区域设置。

工作示例

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();
}

所以现在对于网站上发生的所有事情,中间件都会检查语言并将其设置为会话中的内容。

另外别忘了在 app\Http\Kernel.php 中的 $middlewareGroups 中指定中间件

您可以在网站上的任何地方创建一个表单,供用户选择他的语言偏好,并带有到控制器功能的路由。

【讨论】:

  • 感谢您提供帮助,但我没有尝试使用会话 - 我可以这样做,当然,但我特别需要在 url 中处理语言环境 - 并且有一些 url我没有真正的控制权,所以我不能给它们加前缀。
猜你喜欢
  • 2020-06-10
  • 1970-01-01
  • 2019-02-14
  • 2019-01-23
  • 1970-01-01
  • 2018-07-19
  • 2016-05-21
  • 1970-01-01
  • 2014-03-05
相关资源
最近更新 更多