我正在Laravel 5.3应用程序中创建本地化。它必须遵循以下要求:
例如:
A)
mysite.org/pl/blog/133
将语言环境设置为pl
并使用参数113调用BlogControllerB)
mysite.org/en/blog/133
将语言环境设置为en
并使用参数113调用BlogControllerC)
mysite.org/blog/133
与以前的行为相同。为了实现这一点,我使用了以下代码:
#routes/web.php
require base_path('routes/common.php');
// TODO set default locale to en
Route::group(['prefix' => '{locale}'], function($group) {
require base_path('routes/common.php');
// TODO set locale to $locale
foreach ($group -> getRoutes() as $route) {
$route->where('locale', 'en|ru|pl|ua|de');
}
});
#routes/common.php
Route::get('/blog/{id}', function($id) {
// Return view of respective blogpost
});
问题是,当我使用路径A或B时,我在动作函数中获得了一个额外的第一个参数,该参数是从语言环境前缀衍生而来的。
我可以以某种方式隐藏此参数吗?还是有一种方法可以在结构上更正确地实现我想要的?
最佳答案
我不确定我的解决方案是否最佳
但是你可以试试看
...
namespace App\Http\Middleware;
use Closure;
use Illuminate\Routing\Redirector;
use Illuminate\Http\Request;
class Language {
public function __construct(Redirector $redirector) {
// $this->app = $app;
$this->redirector = $redirector;
// $this->request = $request;
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// Make sure current locale exists.
$segments = $request->segments();
$locale = $segments[0];
$languages = ['en','ru','pl','ua','de'];
if (!in_array($locale, $languages)) {
$segments = array_merge(['en'], $segments);
return $this->redirector->to(implode('/', $segments));
}
return $next($request);
}
}
protected $middleware = [
\App\Http\Middleware\Language::class,
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
];
Route::group(['middleware' => ['web'], 'prefix' => '{locale}'],
function () {
...
希望这个帮助