关于php:如何在Laravel 5中定义默认路由参数

How can I define default route parameters in Laravel 5

我正在使用Laravel 5建立一个多语言站点。

我知道在Laravel中,我可以为以下路径定义prefix

1
2
http://domain/en/users/1
http://domain/en/shop/1

在中间件中,我可以获取url路径段以检测语言并设置当前Request的语言环境。

但是我仍然找不到默认添加lang参数的foolings这样的路由:

1
2
http://domain/users/1?lang=en
http://domain/shop/1?lang=en

或者无论如何我调用时都可以挂接到Framework的路由功能以将默认参数?lang=ja附加到所有路由中吗?
(ja是在中间件之前设置的应用程序的当前语言环境)

谢谢!


您可以创建一个中间件,如果请求中没有该中间件,则该中间件将设置默认的" lang"查询参数。它会处理对您应用程序的所有请求,因此您可以在每个路由处理程序中获取lang参数。

在控制台中(在项目目录中)创建中间件LangFilter:

1
php artisan make:middleware LangFilter

然后打开./app/Http/Kernel.php并添加:

1
\\App\\Http\\Middleware\\LangFilter::class

$middleware数组。现在打开您创建的中间件,即./app/Http/Middleware/LangFilter.php并添加检查和设置代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php

namespace App\\Http\\Middleware;

use Closure;

class LangFilter
{
    /**
     * Handle an incoming request.
     *
     * @param  \\Illuminate\\Http\
equest  $request
     * @param  \\Closure  $next
     * @return mixed
     */

    public function handle($request, Closure $next)
    {
        // Checks for lang in the parameters.
        if($request->input('lang') == null) {
            // Adds the default one since it doesn't have one.
            $request->merge(array('lang' => 'en'));
        }
        return $next($request);
    }
}

如果只想对所有路由的一部分进行这种过滤,则需要在Kernel.php中以不同的方式注册中间件。

更新

用于使助手生成具有当前语言环境的路由:

  • 创建文件夹应用程序/支持。
  • 创建助手文件app / Support / helpers.php
  • 打开helpers.php,并添加以下代码以添加帮助器:

    1
    2
    3
    4
    5
    6
    7
    <?php
      function locale_route($name, $parameters = [], $absolute = true) {
        return route($name, array_merge($parameters, [
          'lang' => App::getLocale()
          ]), $absolute);
      }
    ?>
  • 将帮助程序文件添加到composer.json中的composer自动加载中:

    1
    2
    3
    4
    5
    "autoload" : {
     "files" : [
       "app/Support/helpers.php"
      ]
    }
  • 现在在控制台中运行:

    1
     composer dumpautoload

现在,您可以使用与route相同的参数调用locale_route,以创建在查询参数中添加了当前语言环境的url。


我希望这是您要寻找的。使用查询字符串参数

生成路由