laravel本地化如何在路由和控制器中发送ID

时间:2019-09-04 09:43:01

标签: laravel localization

在具有本地化功能的Laravel项目中,我制作了中间件,路由组和所有参数,语言切换工作正常,但是当我单击以发送ID时

<a href="{{ route('products', [app()->getLocale(), $category->id]) }}" class=""></a>

我得到了错误:

  

缺少[路由:产品] [URI:   {lang} / products / {id}]

我的路线:

Route::group(['prefix' => '{lang}'], function () {
    Route::get('/', 'AppController@index')->name('home');
    Route::get('/categories', 'AppController@categories')->name('categories');
    Route::get('products/{id}', 'AppController@products')->name('products');

    Auth::routes();
});

我的中间件:

public function handle($request, Closure $next)
{
    \App::setLocale($request->lang);

    return $next($request);
}

我的AppController:

public function products($id)
{
    $products = Category::with('products')->where('id', $id)->get();

    return view('products', compact('products'));
}

这是URL:

http://127.0.0.1:8000/fa/products/1

如果我手动更改上述URL,它将起作用并显示页面:

http://127.0.0.1:8000/1/products/1

但是,如果我单击:

<a href="{{ route('products', [app()->getLocale(), $category->id]) }}" class=""></a>

我收到错误消息。

2 个答案:

答案 0 :(得分:1)

由于添加了路由前缀,因此控制器中products方法的第一个参数将为lang,第二个参数为id

这应该修复控制器:

public function products($lang, $id)
{
    $products = Category::with('products')->where('id', $id)->get();

    return view('products', compact('products', 'lang'));
}

答案 1 :(得分:0)

您需要在route('products', ['lang'=>app()->getLocale(), 'id'=>$category->id])中使用键值数组,或者在原始路由中使用任何路由参数命名。

参考Laravel Named Routes

PS。如Remul所述,由于您有一个lang参数(作为路由前缀),因此控制器中的第一个参数将是$lang,然后是$id

public function products($lang, $id)
{
    $products = Category::with('products')->where('id', $id)->get();

    return view('products', compact('products'));
}