【问题标题】:How to best keep my controllers view agnostic?如何最好地保持我的控制器视图不可知?
【发布时间】:2011-03-29 22:23:04
【问题描述】:

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

$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>s 和 <link>s 就可以在它们所属的 <head> 中。

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

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

    我不使用 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 中实现起来相对容易......

    【讨论】:

      【解决方案2】:

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

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

      您必须决定您更相信以下哪一项。

      1. js/css 不属于控制器
      2. php 不属于视图

      这是一个混乱的决定,你必须自己找到解决办法。

      【讨论】:

        【解决方案3】:

        我知道您可能没有使用该代码示例中的 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

        【讨论】:

        • 我没有这样做,但原理是一样的 - 谢谢!
        【解决方案4】:

        您的项目或团队实际上是否足以让 SoC 成为一个问题?或者至少,值得花时间提出这个问题并等待答案?您希望您的视图和 css / js 文件稍后更改吗?

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

        【讨论】:

          【解决方案5】:

          您的方法是正确的,因为您希望所有全局脚本和样式都位于一个控制器中。并且您认为您希望能够将特定脚本和样式包含到特定页面的灵活性是正确的。

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-05
            • 1970-01-01
            • 2012-02-06
            • 1970-01-01
            相关资源
            最近更新 更多