Symfony 2转发请求传递GET/POST参数

问题描述:

是否可以转发请求,传递所有GET/POST参数?Symfony 2转发请求传递GET/POST参数

我想如果我只是做

$this->forward('dest') 

我会去dest没有任何GET/POST PARAMS?

UPDATE

我的目标实际上是有一个像addSomething控制器的行动,需要检查用户是否有足够的“项目”来补充一下。然后将请求转发给执行控制器以继续添加实际添加的{Type} Something

或者在所有控制器中执行“检查”服务会更合适吗?不管怎么说,我认为它的信息知道如何转发到所有控制器动作PARAMS

我在这里看不到任何理由将请求转发回通过内核。正如您所建议的那样,您可以在检查器服务中使用封装此逻辑的路线,也可以创建在路由器侦听器之后运行的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中的和Symfony 2.1中的32。在任何一种情况下,-10的优先级都应该有效。

我很好奇,看看这是否正常工作:)

+0

看起来像是有效的。稍后尝试后会更新它是否有效。如果我想做相反的事情,在控制器操作之后运行一些东西,是否有类似的事件?你如何发现这些看似无证的方法? – 2012-01-06 02:24:44

+0

好的,我找到了我的答案http://symfony.com/doc/2.0/book/internals.html#handling-requests。不知道哪个是正确的使用方法? 'kernel.response'? – 2012-01-06 02:42:40

+0

哦,我使用'@ Route'注释,我怎样才能修改'$ request-> attributes-> get('_control_candidiate')'? – 2012-01-06 03:30:07

最简单的方法(和一个我可能会去)是只通过Request类为进参数

public function indexAction() 
{ 
    $request = $this->getRequest(); 

    return $this->forward('AcmeBundle:Forward:new', array('request' => $request)); 
} 

而且在转发行动只是用它作为方法PARAM:

public function testAction($request) 
{ 
    var_dump($request);exit; 
} 
+4

但是...当使用表单时可能会有问题 - 提交,你会陷入陷阱 - '转发'行动看到$ _POST形式从前一个控制器,所以它在CSRF令牌崩溃(无效,从以前的形式。 – thorinkor 2013-09-04 07:05:06

+0

@thorinkor有没有一个有效的方法呢?我试着用service.csrf.token_manager和getToken()尝试,但没有运气 – userfuser 2017-09-18 11:07:56

+0

@userfuser最好的解决方案 - 避免它:)也许你可以尝试从第一个表单请求中获取它,并在转发方法中重新发送它? – thorinkor 2017-09-18 14:02:20

转发 “请求属性” 的 “路径” 为我的作品:

public function indexAction() 
{ 
    $path = $this->getRequest()->attributes->all(); 
    return $this->forward('CompMyBundle:MyController:MyAction', $path); 
} 

$ PATH [ '_控制器']将在覆盖forward()方法!

所有POST参数都会自动转发。在目标控制器中不需要执行POST参数。 但您必须显式传递查询(GET)参数和路径参数。 forward方法使用2个可选参数分别表示pathParam和queryParam数组。你可以通过当前请求中的所有查询参数

+0

原始问题的最佳答案 – Black 2016-07-22 01:30:29