我正在使用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是之前在中间件中设置的应用程序的当前语言环境)
谢谢!
答案 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中以不同方式注册中间件。
<强>更新强>
用于生成使用当前语言环境生成路由的帮助程序:
打开 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