路由组上显式模型绑定时的laravel错误

时间:2018-05-29 06:48:31

标签: laravel routing laravel-5.6

我写了这个路线组

Route::group(['prefix' => 'admin/{store}',  'middleware' => ['auth', 'SetStoreId'], 'namespace' => 'Admin'], function (App\Models\Store $store) {

Route::get('/', 'DashboardController@index');

Route::resources([
    '/vocabulary' => 'VocabularyController',
    '/term' => 'TermController',
]);

});

并访问此网址

http://localhost/SyriaShop/public/admin/1/vocabulary

然后我收到此错误消息

Type error: Argument 1 passed to Illuminate\Routing\Router::{closure}() must be an instance of App\Models\Store, instance of Illuminate\Routing\Router given, called in E:\wamp\www\SyriaShop\vendor\laravel\framework\src\Illuminate\Routing\Router.php on line 390

虽然我使用这个配置(没有模型绑定)

Route::group(['prefix' => 'admin/{storeId}',  'middleware' => ['auth', 'SetStoreId'], 'namespace' => 'Admin'], function ($storeId)
一切顺利!

2 个答案:

答案 0 :(得分:1)

传递给Route::group的闭包会被传递给它的路由器实例调用(你不能控制它,因为你不是调用者)。

此组中这些路线的操作将在其定义中使用此路线参数store

如果您不希望所有这些控制器方法都需要使用此路由参数,则可以从路径中删除此参数。 (在最近创建的中间件将是一个好地方)

$request->route()->forgetParameter('store');

这应该不需要这些控制器方法来获取此路由参数,并且您已经在中间件中处理此路由参数。

答案 1 :(得分:0)

如果您的表的主键是' id'那种隐式模型绑定将起作用,因为您的代码看起来很好我认为很可能您的表没有列&# 39; ID'作为主键。

如果是这种情况,您可以使用模型上的以下功能覆盖它:

public function getRouteKeyName()
{
    return 'slug';
}

希望是这样的!