PHP技术问题:如何在视图中访问控制器中的数组?
解决视图无法访问控制器中$TPL数组的问题
问题根源
你当前的控制器代码中,先加载视图文件,再给$TPL["results"]赋值。视图执行时,$TPL数组还未被填充数据,所以var_dump显示为空,foreach循环自然会抛出"Invalid argument"错误。
解决方案
1. 调整控制器的文件加载顺序
将视图文件的include放在所有数据赋值操作之后,确保视图加载时$TPL已经有数据:
<?php include "app.config.php"; include "app.model.php"; // 先完成数据查询与赋值 $TPL["results"] = readAllEntries($conn); // 最后加载视图 include "app.view.php"; ?>
2. 理解反向加载的问题
你提到的“视图include控制器”能加载数据但无法执行其他操作,是因为这种方式让控制器逻辑先执行,但会导致视图与控制器高度耦合,后续的数据库操作(如添加数据)会因为加载顺序混乱,无法被正确触发或重复执行,完全违背了分层开发的原则,不建议使用。
3. 视图层容错处理
为了避免空数组或非数组导致的foreach错误,在视图中添加判断逻辑:
<?php $rowNum = 0; // 先校验数组有效性 if (is_array($TPL["results"]) && !empty($TPL["results"])) { foreach($TPL["results"] as $entry) { ?> <tr id="Row_<?php echo $rowNum;?>"> <td>DE</td> <td><?php echo $entry['id']?></td> <td><?php echo $entry['lname']?></td> <td><?php echo $entry['fname']?></td> <td><?php echo $entry['email']?></td> <td><?php echo $entry['phone']?></td> <?php $rowNum++; ?> </tr> <?php } } else { // 无数据时的提示 echo '<tr><td colspan="6">暂无数据</td></tr>'; } ?>
关于$_SESSION的尝试
如果之前用$_SESSION传递数据失败,大概率是没有在代码开头调用session_start()。但用SESSION传递视图渲染数据完全没必要,会增加服务器存储负担,调整加载顺序是更优的方案。
内容的提问来源于stack exchange,提问作者Lance Dillon
相关产品推荐
相关产品推荐

