Val*_*ito 5 php routing laravel
我建立了一个多语言网站,为了显示正确的语言,我做了这样的事情:
routes.php文件:
Route::group(['middleware' => 'web', 'prefix' => '{locale}'], function () {
Route::auth();
Route::get('home', 'HomeController@index');
etc...
});
Run Code Online (Sandbox Code Playgroud)
我的控制器:
<?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');
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我从前缀中获取了局部变量,并在每个函数中设置了本地app.
这是完美的工作,但我想知道是否有更好的方法来做到这一点?我觉得这有点多余..
我正在考虑直接在路由组中设置应用本地.像这样的东西:
Route::group(['middleware' => 'web', 'prefix' => '{locale}'], function ($locale) {
app()->setLocale($locale);
Route::auth();
Route::get('home', 'HomeController@index');
...
});
Run Code Online (Sandbox Code Playgroud)
但这显然不起作用.有人已经处理过这种事了吗?
几天前我找到了解决方案,我想在这里分享。
答案其实很简单:中间件!
首先创建一个新的中间件(在我的例子中为 LocaleMiddleware)
class LocaleMiddleware
{
public function handle($request, Closure $next)
{
app()->setLocale($request->locale);
return $next($request);
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以简单地将你的中间件添加到 App/Kernel.php 中的 Web Middleware 组
protected $middlewareGroups = [
'web' => [
...
\App\Http\Middleware\VerifyCsrfToken::class,
\App\Http\Middleware\LocaleMiddleware::class,
],
'api' => [
'throttle:60,1',
],
];
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助 !