2

我是 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>';
    }
}
4

3 回答 3

3

非常笼统地说,请记住,这不是一个硬性规定,如果你问十个不同的人,你会得到十个略有不同的答案,但模型视图和控制器的工作本质上是:

  1. 该模型为控制器和视图提供了一种从另一个源(例如数据库)访问数据的方法。它基本上是对存储数据的任何内容的抽象。
  2. 视图只是显示给定的数据。
  3. 控制器将模型的数据与视图连接起来,因此它可以显示数据。

我认为您发布的示例代码很好,并且符合这些定义。您的模型检索数据(或处理它),控制器将结果数据交给视图,视图简单地显示它。

但是,我也认为模型可以简单地返回一个项目列表,然后让视图循环遍历它们并显示每个项目,这很好(通常我更喜欢这个)。当然,视图“不应该”做很多处理,但为每个项目输出 HTML 似乎正是它应该做的。我更喜欢这个的原因纯粹是为了分离关注点——你的模型应该是与 HTML 完全无关的。例如,如果您曾经编写过一个非基于 Web 的应用程序来与相同的数据进行交互,那么它可以使用相同的模型。因此,我会将任何 HTML 呈现代码放在我的视图中。即使它需要一些循环逻辑。

不过,归根结底,我认为这对你来说并不重要。如果您非常喜欢将循环放入模型中,请继续使用。最重要的是制定自己的约定,然后坚持下去

于 2013-07-09T22:18:47.873 回答
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()这更有意义,并且不需要在模板中注释。

于 2013-07-09T22:30:49.997 回答
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);
}

考虑你的框架选择,考虑哪些循环在哪里处理什么,但在模型、视图或控制器中需要时应该使用循环。

于 2013-07-09T22:29:54.090 回答