我的controller
里有一个handleAjaxAction
。在这个动作中,我想做不同的事情取决于route
或url
。因此,我正在尝试使用以下方法获取当前页面的路由:
$request->attributes->get('_route');
但是,它给了我ajax
路线,demo_ajax_update
,而不是当前页面的路线,demo_homepage
。
如何在Ajax
操作中获取当前路由?
编辑:
我的Ajax
代码如下:
var route; <-------- Should be set as the route of the current page
$.ajax({
type: "POST",
url: Routing.generate('demo_ajax_update'),
data: JSON.stringify({id: patientId, startDate: startDate, endDate: endDate, route: route}),
dataType: "json",
success: function (data) {
// Doing something
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert('Error : ' + errorThrown);
}
});
在controller
:
public function handleAjaxUpdateAction(Request $request)
{
$data = json_decode($request->getContent());
if($data->route == 'demo_homepage'){
// Do something
}
elseif($data->route == 'demo_anotherroute'){
// Do something
}
}
不使用FOSJsRoutingBundle
的可能解决方法是将uri作为参数传递,并使用router
的match
方法来获取实际的当前路由:
$this->get('router')->match($uri)
给你这个 ajax 调用:
var uri = window.location.pathname; // current page uri (something like `/hello/test`)
$.ajax({
type: "POST",
url: '/path/to/demo/ajax/update',
data: JSON.stringify({
id: patientId,
startDate: startDate,
endDate: endDate,
uri: uri // here you add the current uri
}),
dataType: "json",
success: function (data) {
// Doing something
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert('Error : ' + errorThrown);
}
});
而你的行动:
public function handleAjaxUpdateAction(Request $request)
{
$data = json_decode($request->getContent());
$possibleRoutes = $this->get('router')->match($data->uri);
if (in_array('demo_homepage', $possibleRoutes)) {
// Do something
} elseif (in_array('demo_anotherroute', $possibleRoutes)){
// Do something
}
}
但我想我肯定会做出多种类似AjaxUpdate
动作。控制器至少一个。然后,您不必想知道呼叫来自哪里,并且您将具有较短的操作。如果您计划仅制作 ajax 控制器:
HomepageAjaxController
--> updateAction
--> deleteAction
--> createAction
--> readAction
AnotherAjaxController
--> updateAction
--> deleteAction
--> createAction
--> readAction
您将无法直接从控制器访问它。ajax 请求被视为对服务器的新主请求。(请参阅 HTTP 是无状态的)
正如@Brewal所建议的,一个好主意是将路由与ajax请求一起传递。
为此,您可以通过 3 个步骤执行此操作:
1 安装 FOSJsRoutingBundle
2 公开您尝试访问的路线
3 将该路由与 ajax 请求一起发送。