PHP MVC:将动态生成的Javascript放在何处

PHP MVC:将动态生成的Javascript放在何处,php,javascript,model-view-controller,views,Php,Javascript,Model View Controller,Views,大多数PHPVC系统遵循一种模式,其中请求被路由到特定的控制器操作,然后控制器设置一组变量以在视图中使用 当您处于一个机构/服务工作环境中,该环境对UI元素使用大量动态HTML时,这种模式会导致使用视图变量生成大量javascript <script type="text/javascript"> jQuery(document).ready(function(){ $('#ui-element).init( {

大多数PHPVC系统遵循一种模式,其中请求被路由到特定的控制器操作,然后控制器设置一组变量以在视图中使用

当您处于一个机构/服务工作环境中,该环境对UI元素使用大量动态HTML时,这种模式会导致使用视图变量生成大量javascript

<script type="text/javascript">
    jQuery(document).ready(function(){
        $('#ui-element).init(
            {
                'param1':<?=$this->param1;?>,
                'param2':<?=$this->param2;?>,                   
            }
        );
    });
</script>

jQuery(文档).ready(函数(){
$('#ui元素).init(
{
“参数1”:,
“参数2”:,
}
);
});
虽然这是可行的,但我发现它会导致使用HTML、PHP和Javascript的可怕的意大利面条混合视图。它还冒犯了某类前端开发人员,他们认为所有javascript都应该包含在外部文件中

那么,您处理这个问题的模式/实践是什么?具体地说,当您想要为PHPMVC框架中的Javascript小部件提供一组默认数据时,如何在保持干净和模块化的同时做到这一点?这仅仅是一个纪律问题,还是有特定的设计模式可以在这里强制模块化**,同时仍然为有才华的客户端开发人员提供一个以标记为中心的环境。

编辑: 你也不必那么复杂,你可以简单地拥有一个php类/函数,它只代理ob_start/ob_get_clean,然后将js存储在某个地方,然后将js输出到其他地方。您不必通过php支持或集成库的功能

if可以像下面这样简单:

class UnobtrusiveJsHelper {
  protected static $_instance;
  protected $_js = array();
  protected $_ready = array();

  public static function getInstance()
  {
  }

  public static function setInstance(UnobtrusiveJsHelper $instance)
  {
  }

  public function captureStart($key = null)
  {
    if(null !== $key)
    {
      $this->_js[$key] = null;
    }
    ob_start();
  }

  public function captureEnd($key = null)
  {
    if(null !== $key)
    {
      $this->_js[$key] = ob_get_clean();
      return;
    }
    $this->_js[] = ob_get_clean();

   public function __toString()
   {
      return $this->dumpJs() . $this->_dumpReady();
   }

   public function dumpJs(array $attributes = null)
   {
      if(!empty($this->_js))
      {
         return "<script type=\"text/javascript\">". implode("\n", $this->_js) . "</script>";
      }

      return null;
   }

   public function dumpReady(array $attributes = null)
   {
      if(!empty($this->_js))
      {
         return '<script type="text/javascript">$(document).ready(function(){'. implode("\n", $this->_js) . '});</script>';
      }

      return null;
   }

}
在您的布局中(此处为assumign两步视图):


这就是您使用助手的目的。例如,在Zend_框架中,所有这些小的
onLoad/Ready
片段都被添加到堆栈中。然后,它们在头部的一个地方同时输出

我有一个我为jQ使用的特殊助手,它在Symfony下也做类似的事情

它们允许像
$jq->setVar('myjsvar',1)这样的操作然后,当我转储此文件时,会得到如下结果:

var myjsvar=1在头部的脚本标记中


查看ZendX_Jquery和Zend_Dojo以及它们各自的视图帮助器类,以了解该功能的一个很好的示例。

本次讨论的很多内容都是关于最佳实践的。老实说,如果<100行,IMHO,你所做的很好。另一种方法是从视图中调用函数,并将js作为单独的文件,如下所示(使用适当的默认值):


jQuery(文档).ready(函数(){
showSomeWidget(,);
}

您也可以使用一些jQuery模板插件,如Dojo,但我经常会发现问题多于它的价值。

我个人喜欢这种方法,如果每个人都参与进来,这是很好的,但我发现它最终会阻碍优秀的客户端开发人员,因为1.他们的视图中有这些非本地blob 2.有一个前期的编写成本当您想要合并一些新的jQuery/Dojo/Third party元素时,请使用帮助器。使用PHP生成HTML/Javascript(帮助器就是这样做的)似乎比纯基于视图的方法需要更多的开发时间。不过,还是有用的信息,谢谢!
<?php $js->captureStart(); ?>
  var myjsvariable = 0;
<?php $js->captureEnd();
<script src='/js/widgets.js'></script>

<script type="text/javascript">
    jQuery(document).ready(function(){
         showSomeWidget(<?=$this->name ?> , <?=$this->place ?> );
    }
</script>