是否可以转发请求,传递所有GET / POST参数?
我想如果我做的话
$this->forward('dest')
我会在没有任何GET / POST参数的情况下前往dest
吗?
更新
我的目标实际上是拥有像addSomething
这样的控制器操作,它会检查用户是否有足够的“项目”来添加内容。然后将请求转发给approperiate控制器以继续实际添加{Type} Something
或者在所有进行检查的控制器中获得“检查”服务更合适?无论如何,我认为它有助于知道如何转发到所有参数的控制器动作
答案 0 :(得分:28)
最简单的解决方案(我可能会选择一个)就是将Request类作为前向参数传递
public function indexAction()
{
$request = $this->getRequest();
return $this->forward('AcmeBundle:Forward:new', array('request' => $request));
}
在转发操作中,只需将其用作方法参数:
public function testAction($request)
{
var_dump($request);exit;
}
答案 1 :(得分:15)
我认为没有任何理由通过内核转发请求。您可以按照建议的方式将此逻辑封装在检查器服务中,或者您可以创建一个在路由器侦听器之后运行的kernel.request
侦听器,并仅应用_controller
属性如果你的条件得到满足。
例如,这个routing.yml
:
some_route:
pattern: /xyz
defaults: { _controller_candidate: "FooBundle:Bar:baz" }
这个听众:
class MyListener
{
public function onKernelRequest($event)
{
$request = $event->getRequest();
if (!$controller = $request->attributes->get('_controller_candidiate')) {
return;
}
if (/* your logic... */) {
$request->attributes->set('_controller', $controller');
}
}
}
配置为在核心路由器侦听器之后运行:
services:
my_listener:
class: MyListener
tags:
-
name: kernel.event_listener
event: kernel.request
priority: -10
核心路由器侦听器的优先级在Symfony 2.0中为0
,在Symfony 2.1中为32
。在任何一种情况下,-10
的优先级都应该有效。
我很想知道这是否有效:)
答案 2 :(得分:11)
所有POST参数都会自动转发。在目标控制器中使用POST参数不需要任何操作。 但是你必须明确地传递查询(GET)参数和路径参数。 forward方法采用2个optionals参数分别表示pathParam和queryParam数组。您可以从当前请求传递所有查询参数
public testAction(Request $request){
$pathParam = array(); //Specified path param if you have some
$queryParam = $request->query->all();
$response = $this->forward("AcmeBundle:Forward:new", $pathParam, $queryParam);
}
答案 3 :(得分:1)
转发“请求属性”作为“路径”对我有用:
public function indexAction()
{
$path = $this->getRequest()->attributes->all();
return $this->forward('CompMyBundle:MyController:MyAction', $path);
}
$ path ['_ controller']将在forward()方法中被覆盖!