简单,但对于我这个初学者来说,是个问题。我需要将模型中的数组(读取文本文件时数组中充满信息)传递到控制器,最后传递到视图。 我的型号:
function show_notes(){
$file = "notes.txt";
foreach(file($file) as $entry)
{
list($user, $content) = array_map('trim', explode(':', $entry));
$notes = array (
'user'=> '$user',
'content'=> '$content'
);
}
return $notes;
}
控制器:
function members_area()
{
$this->load->model('Note_model');
$notes[] = $this->Note_model->show_notes();
$this->load->view('includes/header');
$this->load->view('members_area', $notes);
$this->load->view('includes/footer');
}
在视图中我使用这个:
foreach ($notes as $item)
{
echo "<h1>$user</h>";
echo "<p>$content</p>";
}
我收到错误,指出 notes 变量在我看来未定义。
我想我只是不明白数组是如何工作的。我试图阅读有关内容,我尝试过一些与此类似的示例,但仍然无法得到它。
在您的控制器中:
$data['notes'] = $this->Note_model->show_notes();
...
$this->load->view('members_area', $data);
编辑:
您认为:
<?php foreach ($notes as $item):?>
<h1><?php echo $item['user']; ?></h1>
<p><?php echo $item['content'] ?></p>
<?php endforeach; ?>
在您的模型中:
$notes = array();
foreach(file($file) as $entry)
{
list($user, $content) = array_map('trim', explode(':', $entry));
array_push($notes, array('user' => $user, 'content' => $content));
}
return $notes;
更换这个
$notes[] = $this->Note_model->show_notes();
有了这个
$notes['notes'] = $this->Note_model->show_notes();
控制器的职责是将所有必需的参数传递给其他层(模型/库/服务/帮助程序/等——您的情况下的模型方法),并以所需的格式打印可使用的有效负载(如果,比如说,一个 API 端点)或将数据有效负载传递到视图(要渲染/格式化)。
模型应该完全不知道从哪里检索输入数据。换句话说,模型方法永远不应该访问超全局变量(如 get、post、request、session 等)。应该为实用性构建模型方法,以便可以轻松地测试它们并从项目中的各个其他位置调用它们。
视图层应该很少甚至不进行数据处理(应尽可能避免过滤、搜索、重组、合并、清理、验证和算术)。与数据的交互应在很大程度上限于基本循环、琐碎条件和特定于区域设置的格式。
您的控制器正在调用
show_notes()
,然后将返回的数据推送为名为 $notes
的数组的第一个元素。这不符合你的意图。
在模型方法中,您没有将新遇到的数据作为新元素推送到
$notes
数组中,实际上每次迭代都覆盖了相同的元素。
为了让视图能够访问名为
$notes
的变量,控制器必须传递一个数组,其中包含一个名为 notes
的元素,作为视图方法调用的第二个参数。extract()
函数以更好地理解效果)。
在视图循环中,永远不会声明
$user
和 $content
变量。您将需要声明这些变量或使用数组访问语法访问关联值。
这是我建议的 MVC 方法重写:
控制器
public function members_area(): void
{
$this->load->model('Note_model');
$data['notes'] = $this->Note_model->show_notes('file.txt');
$this->load->view('includes/header');
$this->load->view('members_area', $data);
$this->load->view('includes/footer');
}
型号
public function show_notes(string $fileName): array
{
$notes = [];
foreach(file($fileName) as $entry) {
[$user, $content] = array_map('trim', explode(':', $entry));
$notes[] = compact(['user', 'content']);
}
return $notes;
}
查看
foreach ($notes as ['user' => $user, 'content' => $content]) {
echo "<h1>$user</h>";
echo "<p>$content</p>";
}