【发布时间】:2021-04-21 19:32:03
【问题描述】:
我编写了一个多语言应用程序。我不想为默认语言使用语言环境前缀,所以例如我的 URL 结构应该是这样的:
https://example.com/about-us
https://example.com/contant
https://example.com/es/about-us
https://example.com/es/contant
https://example.com/de/about-us
https://example.com/de/contant
我使用Route::group 将我的路线按locale 前缀分组:
Route::group([
'prefix' => '{locale}',
'where' => ['locale' => '[a-z]{2}'],
'middleware' => 'setlocale'
], function () {
Route::get('/{page}', [PageController::class, 'show'])->name('page');
});
在我的中间件 setlocale 中,我为 URL 设置了区域设置和前缀:
public function handle(Request $request, Closure $next)
{
if (in_array($request->segment(1), ['es', 'de'])) {
URL::defaults(['locale' => $request->segment(1)]);
app()->setLocale($request->segment(1));
} else {
URL::defaults(['locale' => 'en']);
app()->setLocale('en');
}
return $next($request);
}
然后我的控制器打印数据:
class PageController extends Controller
{
public function show($lang, Page $page)
{
dd($page);
}
}
这适用于 de 和 es 前缀,但不能没有它们 - 对于英语语言。我试图复制Route::get('/{page}', [PageController::class, 'show'])->name('page'); 并将其粘贴到Route::group 之外,但随后只有一个参数被传递给PageController,我收到以下错误:
Too few arguments to function App\Http\Controllers\PageController::show(), 1 passed in /Users/mati/Sites/laravel-app/vendor/laravel/framework/src/Illuminate/Routing/Controller.php on line 54 and exactly 2 expected
【问题讨论】:
-
您不需要将语言环境传递给控制器...stackoverflow.com/questions/65594630/… 看看这是否对您有帮助
-
谢谢!但是我仍然对
blade文件有疑问。没有我们的 URL 前缀,我有以下错误:Missing required parameter for [Route: homepage] [URI: {locale}] [Missing parameter: locale]. (View: /Users/mati/Sites/laravel-app/resources/views/partials/navbar.blade.php)。我的刀片文件包含<a class="navbar-brand" href="{{ route('homepage') }}"> -
locale 是必需参数,因此必须将某些内容设置为默认值或传递给助手
-
谢谢!我忘了为这个特定的路由传递中间件。
-
如果他们点击包含语言环境前缀的 url 在会话中设置它,然后将他们重定向到没有语言环境前缀的 url 并使用会话语言环境作为语言环境,你想要吗?