控制器和视图 - Zend框架中的MVC

问题描述 投票:1回答:3

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

php model-view-controller zend-framework
3个回答
4
投票

有两个动作助手可以做到这一点。您可以使用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();
    }
}

上面将向上下文切换添加json的上下文,并且当使用请求参数'format'设置调用操作时,它将自动序列化内容,在这种情况下给出由My_Model :::返回的项的json数组使用fetchall();

format参数可以在url“/ my / index / format / json”中传递,也可以使用get查询“/ my / index?format = json”传递

真正的神奇之处在于上下文切换还为响应类型设置了适当的标头,例如content-type。

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


2
投票

首先,业务逻辑应该在模型中,而不是在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捕获到字符串中以通过控制器返回。这将允许您在视图中保持演示。


1
投票

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

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模式的设计方式。

© www.soinside.com 2019 - 2024. All rights reserved.