我要开始使用Zend框架的MVC实现的项目。
如何使用Ajax的工作? 我的意思是,我应该把所有的Ajax代码到控制器? 或进入视野?
例如,我想从笔者“伊万”的帖子显示在页面上。
通常情况下,我创建了一个链接到/职位/作家/伊万“或不服喜欢它,在帖子控制器创建像一个新的行动“byAuthorAction()”(或者用户控制器,无论),鉴于它(和所有代码从什么模型得到的职位去那里),并创建一个新的路由。
如何添加功能得到任何用户在JSON阿贾克斯的职位,XML格式和API也许,保持DRY原则和设计代码结构一样聪明,因为我可以吗?
-
感谢您的解答! 我会很高兴地看到像我这样的情况下,设计MVC的意见。 我有基本的MVC原则,但不是在更复杂的情况下,一些经验。 也许一些有用的链接?
你真的应该阅读有关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解雇。
您可以使用相同的行动来回报XML,JSON或什么的,通过检测Ajax请求,因而能够区分正常的人Ajax请求。 例如:
public function fooAction()
{
if($this->getRequest->isXmlHttpRequest()) {
echo json_encode($someData);
} else {
echo 'This is the normal output';
}
}
你的看法可能比其他HTML的东西,要不就是管道可以请求作出反应是一个ajax后,或你的控制器能够反应。 无论哪种方式,它应该是简单的返回不同的看法。
看看在AjaxContext动作辅助(或ContextSwitch里一个,其延伸),它可以让你使用完全相同的控制器代码,切换到任何一个单独的视图脚本(foo.json.phtml,或FOO .ajax.phtml等 - 从一种格式参数拿起自动),或使用JSON行动,助手的将返回一个对象包括分配给视图中的所有变量 - 所以你不需要是呼应从你的控制器(这会搞乱单元测试,你应该让他们)。
我的语法可能是旧的,但这个从我的指标控制我的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;
}
当我用笨I输出阿贾克斯直出的控制器。
我也使用单独的控制器,用于像标记,收藏等对于像登录,接触等我会添加逻辑以正常路径(例如。domain.com/contact)AJAX请求简单AJAX请求并处理Ajax请求。 我则输出JSON和杀死脚本执行。