【问题标题】:Controllers and Views - MVC in Zend Framework控制器和视图 - Zend 框架中的 MVC
【发布时间】:2010-01-21 19:31:37
【问题描述】:

我在基于 PHP 的 Zend 框架中使用 MVC。这更像是一个设计问题。我有一个控制器,它有几个动作。从控制器的视图通过 AJAX 访问这些操作。控制器的操作,通过访问模型内​​部函数的数据来执行业务逻辑,并构造或回显 HTML。此 HTML 被吐回以在 AJAX 响应中查看。我对控制器的理解是它们根本不应该包含任何 HTML。但是考虑到视图中的 AJAX,我觉得我别无选择,只能在控制器中动态生成 HTML。这是一个好的设计吗?我该如何改进它?

【问题讨论】:

  • 为什么不只返回一个视图作为对 AJAX 请求的响应?这应该是可能的。

标签: php model-view-controller zend-framework


【解决方案1】:

有两个动作助手可以做到这一点。 您可以使用 ajaxContext 或 contextSwitch 操作助手将您的操作重新用于多个上下文。 根据我的经验,上下文切换通常更有用,它甚至可以自动序列化您在操作中分配给视图的数据以获取 json 响应,因此不需要视图脚本。

你像这样初始化上下文切换:

class MyController extends Zend_Controller_Action
{
    public function init()
    {
        $contextSwitch = $this->_helper->getHelper('contextSwitch');
        $contextSwitch->addActionContext('index', 'json')
                      ->initContext();
    }
    public function indexAction()
    {
        $this->view->items = My_Model::fetchAll();
    }
}

上面会在context switch中添加一个json的context,当action被调用并设置了请求参数'format'时,它会自动序列化内容,在这种情况下给出一个json数组返回的items My_Model::fetchAll();

格式参数可以在 url "/my/index/format/json" 中传递,也可以通过 get 查询 "/my/index?format=json" 传递

真正的魔力在于上下文切换还为响应类型设置了适当的标头,例如内容类型。

您甚至可以指定自己的上下文以及要发送的标头。 阅读有关上下文切换的更多信息here

【讨论】:

    【解决方案2】:

    首先,业务逻辑应该在Model中,而不是Controller中。

    其次,我的 ajax 请求通常有这种格式:

    if ($ajax = $this->getRequest()->isXMLHttpRequest()) {
      $this->_helper->layout->disableLayout();   
    };
    
    // then later - if its responding with json:
    
      if ($ajax)
      {
        $this->_helper->viewRenderer->setNoRender(true);     
        $this->getResponse()->setHeader('Content-Type', 'text/json'); 
        echo $this->view->json($some_return_values);
        return;
      }
    

    另外 - 不要忘记您可以使用 $this->view->render('controller/action.phtml'); 将渲染的 phtml 捕获到字符串中以通过控制器返回。这将允许您在视图中保留演示文稿。

    【讨论】:

      【解决方案3】:

      始终尝试将任何表示逻辑留在视图中。我认为您的应用程序的正确设计方法如下:

      AjaxController.php:

      public function AjaxAction() {
          //do some logic
          //set content to a variable
      }
      

      ajax.phtml:

      <p><?php //display the content of the variable setted in the controller ?></p>
      

      您可以稍后单独编辑视图或操作,甚至可能为一些类似的 ajax 生成的内容重新整理视图等。始终尝试以这种方式分离事物,这就是 MVC 模式的设计方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-22
        • 2013-09-27
        • 1970-01-01
        相关资源
        最近更新 更多