Model view controller 如何将逻辑排除在cakephp视图之外?

Model view controller 如何将逻辑排除在cakephp视图之外?,model-view-controller,cakephp,Model View Controller,Cakephp,我理解“视图”应该只向用户显示信息,而不是进行任何真正的“思考” 如果我的表单中有一个字段,我不想限制某些用户级别访问我所做的事情,那么在我的视图中加入一个条件: <td style="v-align: middle;"> <?php if ($auth['level_id'] == 6) { echo $form->input('product_date',

我理解“视图”应该只向用户显示信息,而不是进行任何真正的“思考”

如果我的表单中有一个字段,我不想限制某些用户级别访问我所做的事情,那么在我的视图中加入一个条件:

        <td style="v-align: middle;">
        <?php 
            if ($auth['level_id'] == 6) {

                echo $form->input('product_date',
                    array('class' => 'input-box',
                          'div' => false,
                          'label' => false,                          
                          'readonly' => 'readonly',
                          'style' => 'width:100px; margin-top: 8px; float:left;',
                          'value' => $productiondate,
                          'tabindex' => 3013
                          )
                );
                echo '<div style="padding-left: 10px; float:left;"><a href="#" id="supplier_submit" name="supplier_submit"><img src="/img/submit.png" border="0"/></a></div>';
            }
            else {

                echo $form->input('product_date_ro',
                    array('class' => 'input-box',
                          'div' => false,
                          'label' => false,                          
                          'readonly' => 'readonly',
                          'style' => 'width:100px',
                          'value' => $productiondate,
                          'tabindex' => 3013
                          )
                );

            }
        ?>

        </td>               

不这样做的最佳实践是什么

问候


保罗

你必须在某个时候做出决定。无论你把它放在哪里,你都需要在某处使用
if($level=6)
开关。如果您绝对不想让它出现在视图之外,那么唯一其他可能的地方就是控制器。在控制器中可以做的唯一事情是渲染不同的视图。这在某种意义上是完美的,因为它将所有逻辑都排除在视图之外,但最终将得到大量重复的代码,只有很小的差异

你能做的是:

这将逻辑置于控制器中,同时避免最坏的重复。但是,您的视图越复杂,此解决方案就越不可行

您也可以简单地将决策抽象到控制器中,只为视图设置标志:

// Controller
$flags = array('render_foo' => false, 'render_bar' => true);
if ($level == 6) {
    $flags['render_foo'] = true;
}
$this->set(compact('flags'));
这将提供更好的内部逻辑分离。不过,渲染内容的实际决定仍将在视图中进行


对您来说,最好的解决方案可能介于两者之间。要记住的最重要的一点是,在视图中使用逻辑没有什么错。视图中几乎不可能没有
if
语句。视图可以是智能的并且充满代码,这绝对没有问题。它们不应该包含任何与输出控制器传递给它的数据无关的代码。当然,代码应该尽可能简洁易读。您需要在将事物抽象为助手、元素或完全不同的视图文件之间找到适当的平衡。

我会研究助手。创建一个helper,它将返回您想要的表单输入,前提是您将level_id参数传递给它。我同意Helpers是“外包”和抽象类似内容的好方法,但它仍然不能正确地遵循MVC模式,因为视图和helper处于同一级别。然而,在视图中做一些轻量级的逻辑并不是犯罪,因为Paul最初的例子实际上只适用于“演示”(如果我错了,请纠正我),所以在这种情况下,这是完全正确的。
// Controller
$flags = array('render_foo' => false, 'render_bar' => true);
if ($level == 6) {
    $flags['render_foo'] = true;
}
$this->set(compact('flags'));