PHP 在 MVC 的视图中

PHP inside MVC's view

我想将我的表示层与逻辑层分开,但是我不确定当我必须在表示层中循环或检查内容时我应该做什么?

变量和其他有点静态的内容很容易,我都可以做

<div class='description'><?php echo $product['description']; ?></div>
or
<div class='description'>{{product_description}}</div>

但是循环的东西怎么样?

假设我正在 table 中创建一个用户列表。除了在视图中放置一个 foreach 并在 foreach 中打印 HTML 之外,还有其他方法吗?

<table>
if (!empty($users)) {
    foreach ($users as $key => $value) {
        echo "<tr data-user-id='$value[id]'>";
        echo "<td>$value[id]</td>";
        echo "<td>$value[first_name]</td>";
        echo "<td>$value[last_name]</td>";
        echo "<td><a href='?id=$value[id]&edit=1' class='edit'>Edit</a></td>";
        echo "</tr>";
    }
}
</table>

这会很好地工作,但我无法克服它看起来不再那么 "viewish" 的事实。是否有可能使视图更清洁?当我必须添加条件时怎么办?越来越乱了。

这听起来像是您必须做更多工作才能使视图呈现可读的主要问题。使用 PHP 模板实现此目的的一种简单方法是使用控制流结构的替代语法。这样做可以使模板看起来更具可读性,例如类似于 twig。

使用你的例子:

<table>
    <?php if (!empty($users)): ?>
        <?php foreach ($users as $key => $value): ?>
            <tr data-user-id="<?php echo $value[id]; ?>">
                <td><?php echo $value[id]; ?></td>
                <td><?php echo $value[first_name]; ?></td>
                <td><?php echo $value[last_name]; ?></td>
                <td><a href="<?php echo "?id={$value[id]}&edit=1"; ?>" class="edit">Edit</a></td>
            </tr>
        <?php endforeach; ?>
    <?php endif; ?>
</table>

请注意,我已经移除了开放的卷曲 braquet { 并将其替换为 :。然后在第 10 行用 endif; 结束。 foreach 重复相同的想法。这是控制结构的替代语法。通常在业务逻辑中您会使用其他形式,但是当您需要为视图表示层编写可读模板代码时,这真的很有帮助。