2016-02-18 8 views
5

ho costruito un sito web multilingue e al fine di visualizzare la lingua corretta faccio qualcosa di simile:laravel 5.2 Variabile in un gruppo di percorso

routes.php:

Route::group(['middleware' => 'web', 'prefix' => '{locale}'], function() { 

Route::auth(); 
Route::get('home', '[email protected]'); 
etc... 

}); 

miei Controllers:

<?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'); 
    } 
} 

Come si può vedere, ottengo la variabile locale dal mio prefisso e imposto l'app locale all'interno di ciascuna funzione.

Questo è perfettamente funzionante, ma mi chiedo se c'è un modo migliore per farlo? Sento che è un po 'ridondante ..

Stavo pensando di impostare l'app local direttamente nel gruppo di percorsi. Qualcosa di simile a questo:

Route::group(['middleware' => 'web', 'prefix' => '{locale}'], function ($locale) { 

app()->setLocale($locale); 

Route::auth(); 
Route::get('home', '[email protected]'); 

... 
}); 

Ma questo non è, evidentemente, funziona .. C'è qualcuno ha affrontato questo genere di cose già?

risposta

1

ho trovato la soluzione di un paio di giorni fa, ho voluto condividere qui.

La risposta è in realtà abbastanza semplice: middleware!

Innanzitutto creare un nuovo middleware (nel mio caso LocaleMiddleware)

class LocaleMiddleware 
{ 
    public function handle($request, Closure $next) 
    { 
     app()->setLocale($request->locale); 
     return $next($request); 
    } 
} 

allora si può semplicemente aggiungere il middleware al gruppo Web Middleware in App/Kernel.php

protected $middlewareGroups = [ 
    'web' => [ 
     ... 

     \App\Http\Middleware\VerifyCsrfToken::class, 
     \App\Http\Middleware\LocaleMiddleware::class, 
    ], 
    'api' => [ 
     'throttle:60,1', 
    ], 
]; 

Spero che questo aiuti !