在寻找使用Mink进行Symfony项目功能测试的示例代码时,发现网络上缺乏最新的或合适的文章。因此,撰写了这篇文章,以帮助那些处于相同困境的人。
目标是利用选择下拉列表时的onchange
DOM事件,然后将选定的项目作为参数发送AJAX调用,最后从AJAX调用获取文本响应以设置一个span元素的文本。在Symfony中进行AJAX调用的最简单方式是使用jQuery的ajax
方法。
在Twig模板中,有一个如下的下拉“select”列表:
<select id="ajax">
<option value="Flower">Flower</option>
<option value="Car">Car</option>
<option value="City">City</option>
<option value="Country">Country</option>
</select>
然后,将使用jQuery代码:$('select#ajax').val()
来获取列表中选定的值。
还有一个段落标签在一个div标签内:
<div>
You selected:
<span id="txtHint">Rose</span>
</div>
在其中将使用jQuery代码:$('#txtHint').text(response);
来设置文本。
在Symfony控制器代码中,使用路由注解,因为觉得它更容易管理。所以该页面的路由是“insecure”。以下是代码:
/*
*
* @Route("/insecure", name="insecure")
*/
public function insecureAction(Request $request){
return $this->render('security/insecure.html.twig');
}
这会简单地渲染Twig文件中的代码“insecure.html.twig”,在这种情况下,任何匿名用户都可以访问。
AJAX路由代码稍微复杂一些,尽管仍然相对简单。不使用任何参数,只是简单地从URL中获取查询字符串。以下是代码:
/*
*
* @Route("/ajax", name="ajax")
*/
public function ajaxAction(Request $request)
{
$value = "default";
$selected = $request->query->get('item');
if ($request->isXmlHttpRequest()) {
switch($selected){
case "Flower":
$value = "Rose";
break;
case "Car":
$value = "BMW";
break;
case "City":
$value = "Taft";
break;
case "Country":
$value = "USA";
break;
}
}
return new Response($value);
}
注意,如果路由收到非XMLHTTPRequest(XHR)请求,会返回一个默认值。使用if
语句来检查请求是否确实是XHR请求,然后根据传入的项目进行切换。返回值基于在下拉列表中选定的内容。
通常,使用Symfony调试URL进行所有开发测试,这意味着只需将“app_dev.php”附加到URL。在测试代码中,主机名为“mink_test”。所以调试URL将是:
http://mink_test/app_dev.php/insecure
当在浏览器中输入此URL,然后从下拉列表中选择某个项目时,它将如下所示:
(此处应有截图)
在上面的截图中,调试URL显示了最后一个AJAX请求,带有特殊的AJAX图标。它还显示了实际使用的AJAX URL,在上面的案例中是http://mink_test/ajax?item=Car
;所以查询字符串是?item=Car
,请求返回字符串值“BMW”,并且注意到id为“txtHint”的span被设置为“BMW”。