在路由组上绑定显式模型时出现laravel错误

在路由组上绑定显式模型时出现laravel错误,laravel,routing,laravel-5.6,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' =

我写了这个路线组

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',
]);

});
并访问了这个url

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)

一切顺利

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

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

public function getRouteKeyName()
{
    return 'slug';
}
希望是这样

传递给Route::group的闭包被调用时,路由器的实例被传递给它。由于您不是调用者,因此您无法控制该闭包

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

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

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

这将消除这些控制器方法获取此路由参数的需要,并且您已经在中间件中处理此路由参数。

路由组闭包获取路由器的一个实例,而不是您定义的任何内容。该组中的路由当前将使用其方法定义中的参数。我使用make:model命令创建了存储模型,并且存储表的列“id”作为主键。我添加了显式绑定路由::model'store',store::class;将SetStoreId中间件更改为URL::defaults['store'=>$request->store->id];而且似乎在起作用。谢谢