如何自动将所有Laravel路由的应用程序语言环境设置为前缀?

时间:2019-08-12 14:46:33

标签: laravel laravel-blade

我试图以自动化方式将实际的应用程序区域设置作为所有路由的前缀,atm每次调用这样的路由时都将其作为参数:

web.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);
    }
}

kernel.php:

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

web.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参数时,注意到的中间件才起作用,如果我不编写它,它不会触发,也许是错误的

1 个答案:

答案 0 :(得分:2)

您可以使用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