Laravel 5 route prefix

2019-06-19 05:11发布

问题:

I would like to have a route prefixed by a country. Like this:

/us/shop
/ca/shop
/fr/shop

My idea was to do so:

<?php

Route::group([
    'prefix' => '{country}'
], function() {
    Route::get('shop', 'ShopController@Index');
    // ...
});

This works. My problem is that I'd like to autoload the Country for each sub route and be able to use it from the controller as well as the view.

Any hints?

回答1:

The solution, I've came up with relies on a specific middleware.

<?php

Route::get('', function() {
    return redirect()->route('index', ['language' => App::getLocale()]);
});

Route::group([
    'prefix' => '{lang}',
    'where' => ['lang' => '(fr|de|en)'],
    'middleware' => 'locale'
], function() {

    Route::get('', ['as' => 'index', 'uses' => 'HomeController@getIndex']);

    // ...

}

and the middleware.

<?php

namespace App\Http\Middleware;

use App;
use Closure;
use View;

class Localization {
    public function handle($request, Closure $next) {
        $language = $request->route()->parameter('lang');

        App::setLocale($language);

        // Not super necessary unless you really want to use
        // number_format or even money_format.
        if ($language == "en") {
            setLocale(LC_ALL, "en_US.UTF-8");
        } else {
            setLocale(LC_ALL, $language."_CH.UTF-8");
        }

        View::share('lang', $language);

        return $next($request);
    }
}

As you can guess, this code was meant for a swiss application, hence the _CH everywhere.



回答2:

One way to achieve this is using the segment function of the Request facade:

$country = Request::segment(1);


标签: php laravel-5