Php 控制器和视图-Zend框架中的MVC
我在基于PHP的Zend框架中使用MVC。这更像是一个设计问题。我有一个控制器,它有几个动作。从控制器的视图通过AJAX访问这些操作。控制器的操作,通过访问模型内函数的数据来执行业务逻辑,并构造或回显HTML。此HTML将在AJAX响应中返回查看。我对控制器的理解是,它们根本不应该包含任何HTML。但是考虑到视图中的AJAX,我觉得除了在控制器中动态生成HTML之外,我别无选择。这个设计好吗?如何改进它?始终尝试在视图中保留任何表示逻辑。我认为应用程序的正确设计方法如下: AjaxController.php:Php 控制器和视图-Zend框架中的MVC,php,model-view-controller,zend-framework,Php,Model View Controller,Zend Framework,我在基于PHP的Zend框架中使用MVC。这更像是一个设计问题。我有一个控制器,它有几个动作。从控制器的视图通过AJAX访问这些操作。控制器的操作,通过访问模型内函数的数据来执行业务逻辑,并构造或回显HTML。此HTML将在AJAX响应中返回查看。我对控制器的理解是,它们根本不应该包含任何HTML。但是考虑到视图中的AJAX,我觉得除了在控制器中动态生成HTML之外,我别无选择。这个设计好吗?如何改进它?始终尝试在视图中保留任何表示逻辑。我认为应用程序的正确设计方法如下: AjaxControl
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模式的设计方式 始终尝试在视图中保留任何表示逻辑。我认为应用程序的正确设计方法如下: 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模式的设计方式 首先,业务逻辑应该在模型中,而不是控制器中 其次,我的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捕获到字符串中以通过控制器返回。这将允许您在视图中保留演示文稿。首先,业务逻辑应该在模型中,而不是控制器中 其次,我的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捕获到字符串中以通过控制器返回。这将允许您在视图中保留演示文稿。有两个操作帮助程序可以精确执行此操作。 您可以使用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::fetchAll返回的项目的json数组
format参数可以通过url/my/index/format/json传递,也可以通过get查询/my/index?format=json传递
真正的神奇之处在于,上下文开关还为响应类型(如内容类型)设置适当的头
您甚至可以指定自己的上下文和要发送的标题。
阅读有关上下文切换的更多信息有两个操作帮助程序可以帮助您准确地执行此操作。 您可以使用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::fetchAll返回的项目的json数组
format参数可以通过url/my/index/format/json传递,也可以通过get查询/my/index?format=json传递
真正的神奇之处在于,上下文开关还为响应类型(如内容类型)设置适当的头
您甚至可以指定自己的上下文和要发送的标题。
阅读有关上下文切换的更多信息为什么不返回视图作为对AJAX请求的响应?这应该是可能的。为什么不返回一个视图作为对AJAX请求的响应呢?这应该是可能的。