我在创建Laravel 6控制器时发现了一个奇怪的行为。
我有两条路线叫
Route::resource('role', 'RoleController')->middleware('verified');
Route::resource('category', 'MainCategoryController')->middleware('verified');
两者都工作正常。 在两个控制器中,我都有一个编辑方法
角色控制器
public function edit(Role $role)
{
$permissions = Permission::get();
$users = User::get();
return view('roles.edit', compact('role', 'permissions', 'users'));
}
主类别控制器
public function edit($mainCategory)
{
$mainCategory = MainCategory::findOrFail($mainCategory);
// dd($mainCategory);
return view('categories.edit', compact('mainCategory'));
}
我的问题是,如果我在 MainCategoryController.edit 中使用 in 作为参数MainCategory $mainCategroy它不会给我模型的数据,而是看起来像这样。在正常情况下,如果找不到模型是路由到404。
AppMainCategory {#471 ▼
#guarded: []
#connection: null
#table: null
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: false
+wasRecentlyCreated: false
#attributes: []
#original: []
#changes: []
#casts: []
#dates: array:1 [▶]
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: []
#touches: []
+timestamps: true
#hidden: []
#visible: []
#fillable: []
#forceDeleting: false
}
如果我像上面的函数中那样要求模型数据,一切正常。在RoleController.edit中,它工作正常,我得到了我要求的数据。
我不知道为什么它在角色中工作而不是在主类别中工作。
也许有人知道我在这里做错了什么,因为我无法弄清楚我的错误。
变量名称必须与路由中参数的名称匹配。如果你做一个php artisan route:list
,你会看到一些类似的东西:
| GET|HEAD | category/{category}/edit | category.edit | AppHttpControllersMainCategoryController@edit | web |
这意味着您的控制器需要具有如下签名:
public function edit(MainCategory $category)
{
dd($category);
}
如果您的变量名称不匹配,就像您的情况一样,它将由于依赖注入而创建一个新实例:
public function edit(MainCategory $mainCategory)
{
dd($mainCategory); // New instance of AppMainCategory
}
您可以阅读有关隐式绑定的更多信息:https://laravel.com/docs/6.x/routing#implicit-binding