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