MVC:如何阿贾克斯?(MVC: how to ajax?)

2019-08-17 02:15发布

我要开始使用Zend框架的MVC实现的项目。

如何使用Ajax的工作? 我的意思是,我应该把所有的Ajax代码到控制器? 或进入视野?

例如,我想从笔者“伊万”的帖子显示在页面上。

通常情况下,我创建了一个链接到/职位/作家/​​伊万“或不服喜欢它,在帖子控制器创建像一个新的行动“byAuthorAction()”(或者用户控制器,无论),鉴于它(和所有代码从什么模型得到的职位去那里),并创建一个新的路由。

如何添加功能得到任何用户在JSON阿贾克斯的职位,XML格式和API也许,保持DRY原则和设计代码结构一样聪明,因为我可以吗?

-

感谢您的解答! 我会很高兴地看到像我这样的情况下,设计MVC的意见。 我有基本的MVC原则,但不是在更复杂的情况下,一些经验。 也许一些有用的链接?

Answer 1:

你真的应该阅读有关ContextSwitch动作助手手册章节。 但这里是一个简要介绍:

  • 视图脚本(动作name.phtml)用于普通的HTML输出
  • ; XML上下文默认支持,你会把你的视图脚本XML上下文(动作name.xml.phtml) - 所以大公能够例如XML输出可以在控制器初始化一些动作的上下文切换 XML上下文也禁用布局呈现
  • JSON还通过内置的上下文切换和缺省选项是禁用这两个布局和视图,并输出分配给从JSON格式的控制器动作的视图中的所有变量,该选项可切换支持通过使用setAutoJsonSerialization(上下文切换的假)方法; 但如果你打开它,你必须创建一个视图脚本动作name.json.phtml和输出用手JSON格式的变量

要你有一个格式参数添加到您的网址这两个上下文之间进行切换,如/职位/作家/​​伊万/格式/ JSON或/职位/作家/​​伊万/格式/ XML。 如果没有指定格式的应用程序将输出纯HTML。

上下文切换的特殊版本是AjaxContext,你还必须配置这一手。 它不使用“format”参数,以确定它应该使用输出的格式,但它会检查你的请求中的头和查找“X-要求 - 由于:XmlHttpRequest”头,如果它存在的AjaxContext检查。 使用AjaxContext动作助手,您可以指定应该使用哪些方面的具体行动,如果请求使用AJAX解雇。



Answer 2:

您可以使用相同的行动来回报XML,JSON或什么的,通过检测Ajax请求,因而能够区分正常的人Ajax请求。 例如:

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


Answer 3:

你的看法可能比其他HTML的东西,要不就是管道可以请求作出反应是一个ajax后,或你的控制器能够反应。 无论哪种方式,它应该是简单的返回不同的看法。



Answer 4:

看看在AjaxContext动作辅助(或ContextSwitch里一个,其延伸),它可以让你使用完全相同的控制器代码,切换到任何一个单独的视图脚本(foo.json.phtml,或FOO .ajax.phtml等 - 从一种格式参数拿起自动),或使用JSON行动,助手的将返回一个对象包括分配给视图中的所有变量 - 所以你不需要是呼应从你的控制器(这会搞乱单元测试,你应该让他们)。



Answer 5:

我的语法可能是旧的,但这个从我的指标控制我的REST动作的草图:

/**
 * REST Action for this application.
 *
 * @return void
 */
public function restAction()
{
    $this->_helper->viewRenderer->setNoRender(true);

    $parameters = (func_num_args() > 0) ? array($key => func_get_arg(0)) : $this->getRequest()->getParams();

    $key = 'restCommand';
    if(!array_key_exists($key, $parameters)) throw new Exception('Request for “' . $key . '” not found.');
    $restCommand = $parameters[$key];

    $xmlString = IndexModel::getEmptyXmlSet($restCommand);
    $xslFile = IndexModel::getModelFilePath('index');

    //Handle OPML-driven REST commands:
    if(stripos($restCommand, 'opml-') === 0)
    {
        $opmlCall = explode('-', $restCommand);
        if(count($opmlCall) != 3)
        {
            $xmlString = Songhay_SimpleXml::getXmlMessage('OPML Call Not Recognized', array('The number of parameters are incorrect.'));
        }
        else
        {
            $opmlSet = $opmlCall[1];
            $opmlId = $opmlCall[2];
            $xmlString = IndexModel::getRssFragmentWithOpml($opmlSet, $opmlId);
        }
    }

    //Handle general REST commands:
    switch($restCommand)
    {
        case 'deeplink':
            $key = 'id';
            if(!array_key_exists($key, $parameters)) throw new Exception('Request for “' . $key . '” not found.');
            $url = $parameters[$key];
            $xmlString = IndexModel::getRssFragment($url);
            $xmlString = Songhay_SimpleXml::loadXslString($restCommand, $xmlString, $xslFile);
            break;
        case 'index':
            $opmlFile = IndexModel::getModelFilePath('index', '.xml');
            $xmlString = Songhay_SimpleXml::loadXmlAndStripNamespaces($opmlFile);
            $xmlString = Songhay_SimpleXml::loadXslString($restCommand, $xmlString, $xslFile);
            break;
        default:
            $xmlString = Songhay_SimpleXml::loadXslString($restCommand, $xmlString, $xslFile);
    }

    $response = $this->getResponse();
    $response->setHeader('Content-Type', 'text/xml');
    $response->setBody($xmlString);

    return;
}


Answer 6:

当我用笨I输出阿贾克斯直出的控制器。

我也使用单独的控制器,用于像标记,收藏等对于像登录,接触等我会添加逻辑以正常路径(例如。domain.com/contact)AJAX请求简单AJAX请求并处理Ajax请求。 我则输出JSON和杀死脚本执行。



文章来源: MVC: how to ajax?