我在 View 中有一个这样的表单:
{{ form_start(form, {'action': path('process_route'), 'method': 'POST'}) }}
{# some other fields #}
{{ form_row(form.placeOrder) }}
{{ form_row(form.saveOrder) }}
{{ form_end(form) }}
正如你所看到的,我有两个提交按钮,但这不是问题,我使用 symfony 方法:
if ($form->isValid()) {
// ... do something
// the save_and_add button was clicked
if ($form->get('placeOrder')->isClicked()) {
// probably redirect to the add page again
}
// redirect to the show page for the just submitted item
}
如您所见,我的表单有一个名为'process_route'
的特定操作流程路由。
当我提交表单时,无论用户单击提交按钮,我都会检查用户是否与 security.context
连接。
如果用户已连接,我会在单击两个提交按钮之一时重定向到他调用的路线。
但用户尚未连接,我首先在用户注册
(如果尚未注册)或用户登录表单上重定向。
用户注册或登录后,我需要重定向到他单击两个提交按钮之一时首先询问的路线。
事实上,重定向效果很好,除了重定向是在最后请求的操作上执行的,e-g是在流程路由表单操作上执行的(此处为'process_route'
),我需要重定向到下一步,而不是最后一步。
在我的 security.yml 中,我有这个:
firewalls:
main:
pattern: ^/
form_login:
provider: custom
csrf_provider: security.csrf.token_manager # Use form.csrf_provider instead for Symfony <2.4
use_referer : true
如何通过单击两个提交按钮表单之一来继续管理用户所需操作后的重定向,而不是最后一个操作?
最佳答案
在请求中手动设置referer
。
尝试直接从您的 Controller 执行此操作,例如:
if ($form->get('placeOrder')->isClicked()) {
$request = $this->getRequest();
$request->headers->set('referer', $this->generateUrl('expected_route'));
}
我怀疑该请求不会在下一次更新。
在这种情况下,查找 RequestListener
并找到一种根据条件设置良好referer
的方法。
更新
对于登录,覆盖默认登录表单添加以下字段:
<input type="hidden" name="_target_path" value="{{ app.request.headers.get('referer') }}" />
在所有情况下,都不要忘记从 Controller 手动设置引荐来源网址。
更新2
由于登录表单中的引荐来源
未正确更新,我将尝试为您提供快速替代方案。
如果我理解正确,您正在从 Controller 手动渲染登录表单。
在渲染表单时,将附加参数传递给您的 View :
return $this->render('UserBundle:Security:login.html.twig, array(
'form' => $form->createView(),
// ...
'_target_path' => $this->generateUrl('expected_referer'), // Defined from your condition depending on button clicked
);
关于php - 重定向到下一个/路由操作,而不是用户登录/注册后的最后一个 symfony security,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35431498/