我是OOP和MVC的新手,目前正在使用CodeIgniter建立一个网站。
似乎有很多关于循环应该在视图还是模型中的对比信息。
一方面,我试图将所有的html标记保留在视图中,但另一方面,我希望将混乱的PHP逻辑保留在视图之外。另外,我还需要使用模型中的函数来格式化循环内的数据。
组织此活动的最佳方式是什么?
以下是我当前实现的简化版本:
查看
<section>
<ul>
<?php echo $albumTracklistHtml ?>
</ul>
</section>
控制器
$data = [
'$albumTracklistHtml' => $this->MyModel->getAlbumTracklistHtml()
];
$this->load->view('myPage', $data);
模型
public function getAlbumTracklistHtml()
{
//$this->tracklisting returned from db call in other function
foreach($this->tracklisting as $song) {
$mp3 = $this->convertToAmazonUrl($song['mp3']);
$art = $this->formatArtUrl($song['art']);
$name = $this->formatTrackName($song['name']);
$class = 'mp3';
$btn ='';
if(substr($name, 0, 1) == '*') {
$class = 'load mp3';
$btn = '<span class="playBtn"></span>';
}
<li class="'.$class.'" '.$mp3.'>'.$btn.$name.'</li>';
}
}
答案 0 :(得分:3)
非常一般地说,请记住,这不是一个硬性规则,如果你问十个不同的人,你会得到十个不同的答案,但模型视图和控制器的工作基本上是: / p>
我认为你发布的示例代码很好,并且符合这些定义。您的模型检索数据(或处理它),控制器将结果数据传递给视图,视图只显示它。
但是,我也认为它很好(并且通常我更喜欢这个)模型只返回一个项目列表,然后让视图循环遍历它们并显示每个项目。当然,视图“不应该”进行大量处理,但是为每个项目输出HTML似乎正是它应该做的事情。我更喜欢这个的原因纯粹是为了分离问题 - 你的模型应该是与HTML无关的。如果您曾编写过非基于Web的应用程序来与相同数据进行交互,可以使用相同的模型。因此,我会在我的视图中放置任何HTML呈现代码。即使它需要一些循环逻辑。
但是,在一天结束时,我认为 在你的情况下很重要。如果你更喜欢把循环放在模型中,那就去吧。 最重要的事情只是制定自己的约定,然后坚持。
答案 1 :(得分:1)
以下是我的观点:
<section>
<ul>
<?php foreach($album->getTracks() as $track): ?>
<li
class="<?php echo $track->isPlayable() ? 'load mp3' : '' ?>"
>
<span class="playBtn">
<?php echo $track->getName() ?>
</span>
</li>
<?php endforeach ?>
</ul>
</section>
这假定您传递了一个名为$album
的变量,并且其中提供的方法返回类型为Track
的数组。
如果您愿意,也可以返回数组,但我更喜欢对象,因为您可以将复杂条件转换为简单有意义的名称。因此,程序员调用$track->isPlayable()
而不是你的'*'测试,这更有意义,并且不需要在模板中进行评论。
答案 2 :(得分:0)
根据我的经验,这取决于循环的作用。可以具有视图特定循环。您可以循环显示动态显示元素的html标记,并且应该放在视图中。
for($controller_sent_array as $element)
{
echo "<h4>$element</h4>";
}
然而,循环文件输入之类的东西应该放在控制器/模型端。我在这里提出一个模糊的观点,因为模型与控制器的选择取决于框架优化。但重要的是模型和控制器不发送要呈现的html。相反,他们应该从数据库或用户输入或网络连接处理数据,并打包该数据以供视图找出。为此,您还需要循环。
// This is not a safe way to do this in real life...
for($_POST as $post_input)
{
$this->your_database_library->save_input($post_input);
}
考虑你的框架选择,关于哪些循环正在处理什么,但是在模型,视图或控制器中需要时应该使用循环。