2

在我看来,使用条件块会破坏 MVC 架构的目的吗?

我有一个加载视图的控制器方法,并且我希望根据作为参数传递给该方法的页面 id 有一个不同的按钮组。

一切正常,但在我看来,我有几个:

<?php if($pageID == n) : ?>
    html content...
<?php endif; ?>

这是一个坏习惯吗?如果是,有什么更好的解决方案?在我看来调用库方法似乎也是错误的。

4

2 回答 2

2

有几种方法可以避免该解决方案,但这实际上取决于问题的规模。

更好的解决方案可能类似于以下内容。

看法

<?php echo $conditional_html; ?>

控制器

switch($pageID)
{
  case 1:
        $data['conditional_html'] = $this->load->view('the_first_id_html', TRUE);
        break;
  case 4:
  case 7:
  case 8:
        $data['conditional_html'] = $this->load->view('some_special_html', TRUE);
        break;
  case 13:
  case 18:
        $data['conditional_html'] = $this->load->view('the_secret_menu_html', TRUE);
        break;
  default:
    $data['conditional_html'] = $this->load->view('the_default_html', TRUE);
}
$this->load->vars($data);

如果您不介意在视图中加载视图,另一种更简单的方法可能是这样的:

看法

<?php $this->load->view($conditional_html); ?>

控制器

switch($pageID)
{
  case 1:
        $data['conditional_html'] = 'the_first_id_html';
        break;
  case 4:
  case 7:
  case 8:
        $data['conditional_html'] = 'some_special_html';
        break;
  case 13:
  case 18:
        $data['conditional_html'] = 'the_secret_menu_html';
        break;
  default:
    $data['conditional_html'] = 'the_default_html':
}
$this->load->vars($data);

最后,您可以通过许多不同的方式来做到这一点,但我希望这可以为一些替代方法提供一些启示。

于 2012-09-13T20:23:54.077 回答
1

不,不是。视图应该包含 MVC 设计模式中的表示逻辑。

问题是,在 CodeIgniter 中,您没有真正的视图,只有模板。这与一个事实有关,CodeIgniter 的最初目的是模仿 RubyOnRails,而不是实现 MVC。

如果有人强迫我使用 CodeIgniter,我会在“视图”中使用类似这样的东西:

<?php

$pagelist = array(
   1 => 'foo/b',
   2 => 'foo/a',
   3 => 'foo/r',
   4 => 'lorem/ipsum'
);

$pageID = isset( $pagelist[ $pageId ]) ? $pageID : 1;

?>

<!DOCTYPE html>
<html>

    <!-- some stuff here -->
    <?php include '/path/to/views/' . $pagelist[ $pageId ]; ?>
    <!-- a bit more HTML -->

</html>

$this->load->view()in(CI 称之为)控制器基本上只是一个美化的include/ require。这种方法没有什么神奇之处。

此外,您可能会觉得这很有趣:http ://codeigniter.com/forums/viewthread/62366/

于 2012-09-13T21:25:14.337 回答