如何最好地保持我的控制器视图不可知?

时间:2011-03-29 22:23:05

标签: php model-view-controller codeigniter separation-of-concerns

我在控制器中有以下代码:

$this->viewdata->scripts = array(
    'http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js',
    'jstree/jquery.jstree-1.0-rc2.js',
    'jquery.hotkeys-0.8.js',
    'tags/index.js'
);

$this->viewdata->styles = array(
    'reset.css',
    'tags.css'
);

在我看来,我有foreach将每个列出的javascript / css文件包装到相应的HTML标记中。我正在使用主模板/布局方法;我只填充主模板中的任何/所有字段,最后我的网页结束。因此,我可以在控制器中设置我的javascript / css,这样我的<script><link>可以放在他们所属的<head>中。

然而,最近我突然意识到javascript和css不属于控制器,因为渲染的视图可能会发生变化,并且可能有非常不同的javascript / css要求。

我基本上只想保留一个可维护性的主模板,但也要从控制器中删除对view / javascript / css的所有引用。有什么可以帮助我做到这一点?

感谢。

5 个答案:

答案 0 :(得分:2)

我不使用CI,但我经常使用Zend和Symfony。在这两个框架中都有某种资产助手可以从视图中调用,以便将css或js文件添加到堆栈中。然后,您可以调用类似的帮助程序来输出这些文件。例如在symfony中:

查看:

<?php use_stylesheet('/css/mycss.css'); ?>
<?php use_stylesheet('/css/components.css'); ?>
<?php use_javascript('/js/site.js'); ?>

布局:

<head>
  <?php include_javascripts(); ?>
  <?php include_stylesheets(); ?>
</head>

我认为这样的事情在CI中相对容易实现,如果没有开箱即用的话......

答案 1 :(得分:1)

我有一个项目,我做了同样的事情,尽管不那么雄辩。我以为我会通过“动态”加载js和css来减少发送给客户端的信息量。我使用控制器在我的视图中定义文件名和循环的数组以包含它们。

我记得只有一个js文件我没有最终包括在内。

你必须决定你相信哪一个比另一个更重要。

  1. js / css不属于控制器
  2. php不属于视图
  3. 这是一个混乱的决定,你必须找到自己的方式。

答案 2 :(得分:1)

我意识到你可能没有使用该代码示例中的cakePHP,但是!他们有一个很好的方法来处理这个问题。它是“内联”样式,脚本等的参数......

在您的代码中,您有以下内容:

<?= $scripts_for_layout ?>
<?= $styles_for_layout ?>

在视图文件本身中,你有这样的代码:

<?php $this->Html->script('jquery', array('inline' => true)); ?>

所以实际的视图文件呈现,将所有脚本存储到某个地方的某个数组中,然后呈现布局文件(页眉,页脚,你有什么)。

布局文件将存储的数组转换为$ scripts_for_layout变量。

漂亮天才,效果很好。我建议做这样的事情。

参考:http://book.cakephp.org/view/1589/script

答案 3 :(得分:0)

您的项目或团队实际上是否足以让SoC受到关注?或者至少,有人值得问这个问题并等待答案?您希望您的视图和css / js文件稍后更改吗?

如果您对这些问题的回答是肯定的,并且值得修改您的设计,那么您可以将您的视图包含在css和js中。会有很多共同之处,因此请在其中包含公共css和js文件的视图,并在其他视图中包含该视图文件。你在这里不需要任何复杂的东西。或者至少,我不会。

答案 4 :(得分:0)

您有正确的方法,因为您希望所有全局脚本和样式位于一个控制器中。而且您正在思考您希望能够灵活地将特定脚本和样式包含在特定页面中,这是正确的道路。

要实现此目的,您可以创建基本控制器并扩展控制器。您的基本控制器将包含您的所有全局脚本和样式。您的扩展控制器将包含仅特定于某个页面(或页面组)的脚本和样式。

在创建基本控制器时,请查看以下链接:
http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY

请注意,在CI2中,基本控制器应位于 / application / core / 目录中。