Laravel 5.4:向ProductCategoryController传$productCategory为空问题排查
兄弟,我之前也踩过类似的坑,咱们一步步来捋清楚可能遗漏的点:
路由参数与模型变量名不匹配
当你用Route::resource('/product-cat', 'ProductCategoryController')时,Laravel自动生成的路由参数名是product_cat(URI里的短横线会被转成下划线)。而隐式模型绑定要求方法里的变量名和路由参数名严格对应(或者手动指定映射关系)。
如果你控制器方法里写的是:public function show(ProductCategory $productCategory) { dd($productCategory); }这里变量名是
$productCategory,但路由参数是product_cat,Laravel找不到对应关系,就会注入空的模型实例。解决办法有两个:- 把变量名改成和参数名对应的驼峰形式:
public function show(ProductCategory $productCat) { dd($productCat); } - 在路由里手动指定参数与变量的映射:
Route::resource('/product-cat', 'ProductCategoryController') ->parameters(['product-cat' => 'productCategory']);
这样Laravel就知道把
product-cat这个URI段映射到$productCategory变量上了。- 把变量名改成和参数名对应的驼峰形式:
忘记给变量加模型类型提示
如果你的控制器方法里只写了public function show($productCategory),没有加上ProductCategory类型提示,那这个变量只是URL里传的ID字符串(或者空值),不是自动注入的模型实例。一定要加上类型提示才能触发隐式模型绑定:// 正确写法 public function show(ProductCategory $productCategory) { ... }访问的URL不对,没传模型ID
资源路由的index方法(对应GET /product-cat)本来就不需要模型参数,如果你访问的是这个URL,那控制器里的$productCategory肯定是空的。你需要访问带ID的路由,比如GET /product-cat/1,才能触发show方法并注入对应的模型实例。模型主键配置错误
如果你的ProductCategory模型主键不是默认的id字段(比如是category_id),那你必须在模型里显式指定:class ProductCategory extends Model { protected $primaryKey = 'category_id'; // 如果主键是字符串类型,还要加上这句 public $incrementing = false; }不然Laravel会用
id去数据库查询,找不到对应记录的话,要么抛出404,要么返回空模型实例。在构造函数里试图获取模型实例
如果你是在控制器的构造函数里使用$productCategory,那隐式绑定是不生效的——因为构造函数在路由解析完成前就执行了,没法注入模型。这种情况你得在具体的方法(比如show/edit)里接收模型参数,而不是构造函数。
先从这几个点排查,应该能解决问题!
内容的提问来源于stack exchange,提问作者Yousef Altaf

