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

时间:2010-01-21 19:31:38

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

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

3 个答案:

答案 0 :(得分: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'设置调用操作时,它将自动序列化内容,在这种情况下给出返回的项的json数组My_Model ::使用fetchall();

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

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

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

的更多信息

答案 1 :(得分: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捕获到字符串中以通过控制器返回。这样您就可以在视图中保留演示文稿。

答案 2 :(得分: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模式的设计方式。