Symfony2:如何在Ajax控制器中获取当前路由



我的controller里有一个handleAjaxAction。在这个动作中,我想做不同的事情取决于routeurl。因此,我正在尝试使用以下方法获取当前页面的路由:

$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作为参数传递,并使用routermatch方法来获取实际的当前路由:

$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 请求一起发送。

最新更新