如何转发GET参数?

时间:2015-08-11 09:05:43

标签: php symfony

如何使用GET参数转发?

我在同一个控制器中有两个动作。我在第一个动作中做了一些魔术,如果一切顺利,我希望它转发到另一个动作,但在第一个动作中创建了GET个参数。

我现在拥有的是:

return $this->forward('AppBundle:default:tracked', array(), array(
                    'tracking_code' =>  $tracking_code,
                    'company'       =>  $tp_company_name
            )));

在那里清空数组,因为他们不顾一切地努力让它发挥作用。 Documentation告诉第二个数组是查询参数,但没有真正发生,所以我一定做错了。

第二个动作尝试获取如下参数:

/**
* @Route("/tracked", name="tracked")
*/
public function trackedAction()
{
    $request = Request::createFromGlobals();
    // If there is the required variables in the GET:
    if($request->query->has('tracking_code') && $request->query->has('company'))

但不,变量似乎永远不会到达那里。

我有这种设置的原因是,用户也可以从其他地方进入trackedAction

2 个答案:

答案 0 :(得分:3)

我认为在第二个动作中获取参数的正确方法是这样做:

return $this->forward('AppBundle:default:tracked', array(
                'tracking_code' =>  $tracking_code,
                'company'       =>  $tp_company_name
        )));

你的第二个动作是:

/**
* @Route("/tracked/{tracking_code}/{company}", name="tracked")
*/
public function trackedAction($tracking_code=null, $company=null)
{
    ...
}

我使用了$tracking_code = null,因为你指定了这个可以从另一个地方访问,也许不提供这些参数。这样它对两者都有效。

希望这有帮助。

答案 1 :(得分:2)

Symfony控制器转发的工作方式是使用您传递的选项复制当前Request,然后通过HttpKernel组件重新分派它。你可以看到这个in the code。因为它是一个子请求,所以您的第二个操作是从全局(即Request等)创建一个$_GET,但没有更改。

解决方案是将您的第二个操作方法签名更改为:

public function trackedAction(Request $request)

这意味着$request变量将对您的操作“本地”,并包含您想要的变量。

在实践中,您应该始终Request传递给您的操作,因为它会使您的控制器更加可测试并防止出现类似的奇怪问题。

除了上述所有内容之外,您可以使用redirect来代替HTTP重定向,而不仅仅是在Symfony请求系统中进行转发。