Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 控制器和视图-Zend框架中的MVC_Php_Model View Controller_Zend Framework - Fatal编程技术网

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

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

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

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

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

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

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请求的响应呢?这应该是可能的。