首页 > 解决方案 > 如何自动将应用程序语言环境设置为所有 laravel 路由的前缀?

问题描述

我正在尝试以自动方式获取实际的应用程序语言环境作为我所有路由的前缀,atm 每次调用这样的路由时我都会将其作为参数提供:

网页.php

Route::group(['prefix' => '{language}'], function() {

    Route::get(__('contact'), function () {
        return view('pages.contact');
    })->name('contact');

});

header.blade.php

<li class="nav-item">
 <a class="nav-link" href="{{route('contact', app()->getLocale())}}">@lang('contact')</a>
</li>

这实际上有效,例如显示 en_US/contact,有没有办法避免在路由呼叫中提供语言环境?

编辑:经过一些回答后,我按照这里的文档https://laravel.com/docs/5.8/urls#default-values,所以我的代码看起来像这样:

中间件:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\URL;

class SetDefaultLocaleForUrls
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        URL::defaults(['locale' => app()->getLocale()]);
        return $next($request);
    }
}

内核.php:

 protected $routeMiddleware = [
....
'locale' => \App\Http\Middleware\SetDefaultLocaleForUrls::class,
....
];

网页.php:

Route::group(['prefix' => '{locale}', 'middleware' => 'locale'], function () {
    Route::get(__('contact'), function () {
            return view('pages.welcome');
        })->name('contact');
});

但仍然需要给语言环境我做错了什么?

"Missing required parameters for [Route: contact] [URI: {locale}/contact]"

EDIT2:注意中间件仅在我在 URL 上设置 locale 参数时才有效,如果我不写它不会触发,也许有错误

标签: laravellaravel-blade

解决方案


您可以使用该方法设置 url 的默认值URL::defaults()。您可以将其放在中间件中以使其适用于所有路由。

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\URL;

class SetDefaultLocaleForUrls
{
    public function handle($request, Closure $next)
    {
        URL::defaults(['locale' => $request->user()->locale]);

        return $next($request);
    }
}

此处的文档中提到了它: https ://laravel.com/docs/5.8/urls#default-values


推荐阅读