【问题标题】:Symfony2: How to get a current route in Ajax controller?Symfony2:如何在 Ajax 控制器中获取当前路由?
【发布时间】:2014-02-24 15:28:10
【问题描述】:

我的controller 中有一个handleAjaxAction。在这个动作中,我想做不同的事情取决于routeurl。所以,我试图通过以下方式获取当前页面的路由:

$request->attributes->get('_route');

但是,它给了我ajax 路由demo_ajax_update,而不是当前页面的路由demo_homepage

如何在Ajax action 中获取当前路线?

编辑:

我的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
    }
}

【问题讨论】:

  • 你不能把路由作为参数吗?
  • 所以,我必须使用 javascript 获取当前页面的路由,以便将正确的路由发送到controller。我一直在寻找它,但仍然不知道如何实现这一点。

标签: ajax symfony


【解决方案1】:

在这种情况下不使用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

【讨论】:

  • 非常感谢。好方法。
【解决方案2】:

您将无法直接从控制器访问它。 ajax 请求被视为对服务器的新主请求。 (见http is stateless

正如@Brewal 所建议的,一个好主意是将路由与 ajax 请求一起传递。

为此,您可以分 3 步完成:

1 安装FOSJsRoutingBundle

2 暴露你试图访问的路由

3 将该路由与 ajax 请求一起发送。

【讨论】:

  • 感谢您的回复。我正在使用FOSJsRoutingBundle。问题是,如果我想将路由与 ajax 请求一起传递,首先,我必须使用 javascript 获取当前页面的路由,以便将正确的路由发送到controller。我一直在寻找它,但仍然不知道如何实现这一点。
  • +1 用于 FOSJsRoutingBundle。 @LVarayut,您应该使用当前在 javascript 中的 ajax 调用来编辑您的问题。
  • @LVarayut 我不确定是否有 js 方式来获取路线。但是,您可以在模板中获取路线:请参阅here,然后您可以决定如何使用它。
  • 谢谢你们俩。请看看我更新的问题。
猜你喜欢
  • 1970-01-01
  • 2013-04-03
  • 2015-09-22
  • 1970-01-01
  • 2013-05-19
  • 2012-10-13
  • 1970-01-01
  • 2015-05-08
  • 2015-01-13
相关资源
最近更新 更多