如何在 Laravel 5 中定义默认路由参数


How can I define default route parameters in Laravel 5

我正在使用Laravel 5构建一个多语言网站。

我知道在 Laravel 中,我可以为路由定义prefix,例如:

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

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

但是无论如何我都找不到默认为像 folowings 这样的路由添加 lang 参数:

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

或者当我调用时,是否有任何钩接到框架的路由函数以将默认参数?lang=ja附加到所有路由中?(ja 是之前在中间件中设置的应用程序的当前区域设置(

谢谢!

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

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

php artisan make:middleware LangFilter

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

'App'Http'Middleware'LangFilter::class

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

<?php
namespace App'Http'Middleware;
use Closure;
class LangFilter
{
    /**
     * Handle an incoming request.
     *
     * @param  'Illuminate'Http'Request  $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 中以不同的方式注册中间件。

更新

对于制作使用当前语言环境生成路由的帮助程序:

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

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

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

     composer dumpautoload
    

现在,您可以使用提供给route的相同参数调用locale_route,以创建在查询参数中添加了当前区域设置的 URL。

我希望这就是你要找的。使用查询字符串参数生成路由