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
的优先级都应该有效。
我很好奇,看看这是否正常工作:)
最简单的方法(和一个我可能会去)是只通过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;
}
但是...当使用表单时可能会有问题 - 提交,你会陷入陷阱 - '转发'行动看到$ _POST形式从前一个控制器,所以它在CSRF令牌崩溃(无效,从以前的形式。 – thorinkor 2013-09-04 07:05:06
@thorinkor有没有一个有效的方法呢?我试着用service.csrf.token_manager和getToken()尝试,但没有运气 – userfuser 2017-09-18 11:07:56
@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数组。你可以通过当前请求中的所有查询参数
原始问题的最佳答案 – Black 2016-07-22 01:30:29
看起来像是有效的。稍后尝试后会更新它是否有效。如果我想做相反的事情,在控制器操作之后运行一些东西,是否有类似的事件?你如何发现这些看似无证的方法? – 2012-01-06 02:24:44
好的,我找到了我的答案http://symfony.com/doc/2.0/book/internals.html#handling-requests。不知道哪个是正确的使用方法? 'kernel.response'? – 2012-01-06 02:42:40
哦,我使用'@ Route'注释,我怎样才能修改'$ request-> attributes-> get('_control_candidiate')'? – 2012-01-06 03:30:07