0

我有一个多语言网站。我想在其中添加当前语言环境作为我所有项目路线的前缀。为此,无论何时我使用路由,我都必须始终为路由的语言环境参数提供一个值。我认为有更好的方法来做到这一点。

我的路线看起来像这样

Route::prefix('{locale}')->group(function() {
    Route::get('/', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
    Route::get('/blog', [App\Http\Controllers\PostController::class, 'index'])->name('blog');
});

我希望我在 url 中的路径看起来像这样。

  • http://localhost/project/en/blog 或
  • http://localhost/project/fa/blog

我还有一个中间件SetLocale,我根据通过的请求路径决定应用程序区域设置;

这是我的中间件代码

class SetLocale
{
    public function handle(Request $request, Closure $next)
    {

        $locale = $request->segment(1);
        if (! is_null($locale) && ! in_array($locale, config('app.locales')) ) // config('app.locales') = ['en', 'ar', 'fa']
            abort(404);

        $html_dir = in_array($locale, ['en'])?'ltr':'rtl';
        \Illuminate\Support\Facades\Config::set('app.html_dir', $html_dir);
        \Illuminate\Support\Facades\App::setLocale($locale);


        return $next($request);
    }
}
4

2 回答 2

0

您必须通过组路线进行

https://laravel.com/docs/8.x/routing#route-groups

好的,对不起。那么跟随呢?

Route::prefix('{locale}')->middleware('SetLocale')->group(function() {
    Route::get('/', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
    Route::get('/blog', [App\Http\Controllers\PostController::class, 'index'])->name('blog');
});
于 2021-12-20T09:00:41.850 回答
0

你可以使用defaultsURL Generator 的方法来做这件事:

URL::defaults(['locale' => $locale]);

将其添加到您的中间件中,locale当使用该参数生成路由的 URL 时,该参数将具有默认值。

Laravel 8.x 文档 - URL 生成 - 默认值 defaults

于 2021-12-20T09:47:29.183 回答