MVC:如何ajax?

Val*_*lev 7 php ajax model-view-controller zend-framework

我将使用Zend Framework MVC实现启动一个项目.

我如何使用ajax?我的意思是,我应该将所有ajax代码放入控制器吗?还是进入视野?

例如,我想从作者'ivan'获取帖子以显示在页面上.

通常,我创建一个指向'/ posts/author/ivan'的链接或类似它的链接,在Posts控制器(或者可能是用户控制器,无论在哪里)中创建一个像'byAuthorAction()'的新Action,查看它(以及所有代码)什么从模型获得帖子去那里)并创建一个新的路由到它.

如何添加功能以获取json的任何用户帖子,ajax和API的xml格式,保持DRY原则并尽可能智能地设计代码结构?

-

谢谢你的回答!我很高兴看到有关在像我这样的情况下设计MVC的评论.我在基本的MVC原则方面有一些经验,但在更复杂的情况下却没有.也许一些有用的链接?

Gor*_*rić 13

您真的应该阅读有关ContextSwitch Action Helper的手册章节.但这里有一个简要的概述:

  • 您的视图脚本(action-name.phtml)用于常规HTML输出
  • 您可以为控制器中的某些操作初始化上下文切换,以便输出例如XML - 默认情况下支持xml上下文,您可以将视图脚本放在xml上下文中(action-name.xml.phtml); xml上下文还禁用了布局的呈现
  • 内置上下文切换也支持json,默认选项是禁用布局和视图,并以JSON格式输出从控制器操作分配给视图的所有变量,可以使用setAutoJsonSerialization切换此选项( false)上下文切换的方法; 但如果你切换它,你必须创建一个视图脚本action-name.json.phtml并手动输出JSON格式的变量

要在这两个上下文之间切换,您必须在URL中添加格式参数,例如/ posts/author/ivan/format/json或/ posts/author/ivan/format/xml.如果您没有指定格式,您的应用程序将输出纯HTML.

Context开关的特殊版本是AjaxContext,您还必须手动配置它.它不使用'format'参数来标识它应该用于输出的格式,但它会检查请求中发送的标头,并查找"X-Requested-With:XmlHttpRequest"标头,如果存在,则检查AjaxContext.使用AjaxContext操作助手,您可以指定在使用AJAX触发请求时应将哪个上下文用于特定操作.


kar*_*m79 8

您可以通过检测ajax请求来使用相同的操作来返回XML,JSON或其他任何内容,从而能够区分ajax请求和正常请求.例如:

public function fooAction()
{
    if($this->getRequest->isXmlHttpRequest()) {
        echo json_encode($someData);
    } else {
        echo 'This is the normal output';
    }
}
Run Code Online (Sandbox Code Playgroud)