我建立了一个多语言网站,为了显示正确的语言,我做了类似的事情:
routes.php文件:
Route::group(['middleware' => 'web', 'prefix' => '{locale}'], function () {
Route::auth();
Route::get('home', 'HomeController@index');
etc...
});
我的控制器:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Http\Requests;
use Illuminate\Http\Request;
class HomeController extends Controller
{
public function index($locale)
{
app()->setLocale($locale);
return view('home');
}
}
正如您所看到的,我从前缀中获取了局部变量,并在每个函数中将应用设置为本地。
这是完美的工作,但我想知道是否有更好的方法来做到这一点?我觉得这有点多余..
我正在考虑直接在路由组中设置应用本地。 像这样:
Route::group(['middleware' => 'web', 'prefix' => '{locale}'], function ($locale) {
app()->setLocale($locale);
Route::auth();
Route::get('home', 'HomeController@index');
...
});
但这显然不起作用。有人已经处理过这类事了吗?
答案 0 :(得分:1)
我几天前找到了解决方案,我想在这里分享。
答案其实很简单:中间件!
首先创建一个新的中间件(在我的案例中是LocaleMiddleware)
class LocaleMiddleware
{
public function handle($request, Closure $next)
{
app()->setLocale($request->locale);
return $next($request);
}
}
然后,您只需将中间件添加到App / Kernel.php
中的Web Middleware组即可protected $middlewareGroups = [
'web' => [
...
\App\Http\Middleware\VerifyCsrfToken::class,
\App\Http\Middleware\LocaleMiddleware::class,
],
'api' => [
'throttle:60,1',
],
];
希望这有帮助!
答案 1 :(得分:0)
使用此程序包帮助我进行本地化https://github.com/mcamara/laravel-localization