Model view controller 好的实践:在视图中使用循环/while,还是在控制器中使用循环/while,但将HTML放入控制器中?

Model view controller 好的实践:在视图中使用循环/while,还是在控制器中使用循环/while,但将HTML放入控制器中?,model-view-controller,Model View Controller,我的同事说在视图中放置逻辑(while/loop)是一种糟糕的做法,所以他让我在控制器中使用它们来呈现HTML表的内容,但我认为在控制器中放置HTML是一种更糟糕的做法,请就最佳做法提供建议?(如果你有这样的链接,说明为什么要从另一个中选择一个,真的很感激) 方法1:视图中没有逻辑,但控制器中有大量HTML <table> <thead> <tr> <th>Username&l

我的同事说在视图中放置逻辑(while/loop)是一种糟糕的做法,所以他让我在控制器中使用它们来呈现HTML表的内容,但我认为在控制器中放置HTML是一种更糟糕的做法,请就最佳做法提供建议?(如果你有这样的链接,说明为什么要从另一个中选择一个,真的很感激)

方法1:视图中没有逻辑,但控制器中有大量HTML

        <table>
        <thead>
        <tr>
            <th>Username</th>
            <th>Name</th>
        </tr>
        </thead>
        <tbody>
        <tr>
        <?= $users_print; ?>
        </tbody>
    </table>
控制器

<?php
//build a string in the controller with the HTML and send it to the view
foreach ($users as $user) {
    $users_print .= '
<tr>
    <td>' . $user['username'] . '</td>
    <td>' . $user['name'] . '</td>
</tr>
'; 
?>

查看(只需使用控制器中内置的HTML打印字符串)


用户名
名称
方法2:在视图中执行循环,控制器中没有HTML,但在视图中需要使用循环/while

查看

<table>
<thead>
<tr>
    <th>Username</th>
    <th>Name</th>
</tr>
</thead>
<tbody>
<?php
foreach ($users as $user) {
?>
    <tr>
        <td><?= $user['username']; ?></td>
        <td><?= $user['name']; ?></td>
    </tr>
<?php 
} 
?>
</tbody>

用户名
名称

我将继续第二种方法。在我看来(除了你所说的之外),你没有在你的观点中做任何“逻辑”,因为你在接收信息时输出信息。

不确定我是否能帮助你,但我认为,这是品味的问题

我宁愿在视图中执行循环,因此控制器和模型不包含任何“设计输出”。控制器或模型不应关心设计。如果有人将更改/设计您的输出代码,他/她不应在控制器或模型中搜索-仅在视图中搜索。设计师不应编辑控制器或模型,而应仅编辑视图


但重要的是,要坚持在整个代码中设置的规则。

如果需要显示未知数量的元素,则通常可以接受视图中的循环。As是非常轻的分支-主要用于确定视图的某些部分是否应可见

视图中不应该包含的是“业务逻辑”。这不是一个非常精确的类别,但基本上,比如说,您不应该计算要显示的值。但是,这种观点根本没有活力,这通常是不切实际的。(除非视图技术被明确设计为至少对重复和可选元素提供非强制性支持,但这在面向组件的框架(如Wicket或ASP.NET Web表单)中更常见,而在MVC中则不常见。在原始PHP中肯定没有这种情况。)

理想情况下,使用不同类型的视图显示控制器的输出应该是可行的,例如,将JSON返回到应用程序而不是HTML的视图。如果您在控制器中组装HTML块,这将变得不可能,否则您将不得不复制控制器