Laravel 5.2一组路线中的变量

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)

但这显然不起作用.有人已经处理过这种事了吗?

Val*_*ito 1

几天前我找到了解决方案,我想在这里分享。

答案其实很简单:中间件!

首先创建一个新的中间件(在我的例子中为 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)

希望这可以帮助 !