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

时间:2015-07-04 10:07:16

标签: php laravel-5 laravel-routing

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

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

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

在Middleware中,我可以获取url路径段来检测语言并设置当前Request的区域设置。

但是无论如何我都找不到默认路由中的lang参数,如下所示:

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

或者是否有任何方式挂钩到Framework的路由功能,以便在我调用时将默认参数?lang=ja附加到所有路由中? (ja是之前在中间件中设置的应用程序的当前语言环境)

谢谢!

2 个答案:

答案 0 :(得分:1)

如果请求没有,则可以创建一个设置默认“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中以不同方式注册中间件。

<强>更新

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

  • 创建文件夹app / Support。
  • 创建帮助文件app / Support / helpers.php
  • 打开 helpers.php ,并添加此代码以添加帮助程序:

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

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

     composer dumpautoload
    

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

答案 1 :(得分:0)

我希望这就是你要找的东西。 Here