
本文详解 yii2 中控制器向视图传递 active record 数据时常见的 `null` 问题,重点说明变量命名一致性、视图变量声明规范及 `compact()` 与数组传参的区别。
在 Yii2 开发中,控制器通过 render() 方法向视图传递数据是基础操作,但若处理不当(如变量名不匹配或视图未正确声明类型),极易导致 $product 等变量为 NULL —— 这并非数据库查询失败,而是视图层根本未接收到预期变量。
根本原因在于:你使用了 compact('product'),它会将当前作用域中名为 $product 的变量打包为键 'product' 的关联数组;而视图中直接使用 var_dump($product) 时,PHP 会尝试读取一个未定义的局部变量 $product(而非从渲染参数中自动提取),因此返回 NULL。
✅ 正确做法是显式以关联数组方式传参,并在视图中通过 PHPDoc 注解明确变量类型与名称:
控制器(SliderController.php)应改为:
public function actionIndex()
{
$products = ProductList::find()->all(); // 推荐使用复数变量名体现集合语义
return $this->render('index', ['products' => $products]); // 显式键值对,清晰可靠
}视图(views/slider/index.php)需添加类型声明并使用对应变量名:
name) . '
'; } ?>
⚠️ 注意事项:
- 避免依赖 compact() 传递变量,尤其在团队协作或复杂逻辑中易引发命名歧义;
- 视图顶部务必添加 @var 注解,既提升代码可读性,也支持 PhpStorm 等 IDE 的智能提示与类型检查;
- 模型类 ProductList 建议更名为 Product(单数,符合 ActiveRecord 命名惯例),表名仍可保持 'product',便于后续扩展(如 Product::findOne(1) 更自然);
- 若查询无结果,ProductList::find()->all() 返回空数组 [] 而非 NULL,因此 var_dump($products) 显示 array(0) { } 才属正常,NULL 必定是变量未传递成功。
通过以上调整,即可彻底解决数据“无法到达视图”的问题,确保 MVC 各层职责清晰、数据流转可靠。










