【问题标题】:Symfony2 - get or create route's arguments array?Symfony2 - 获取或创建路由的参数数组?
【发布时间】:2016-10-19 14:04:16
【问题描述】:

在系统(Symfony 2.8)中,对于某些对象,我们在对象列表和对象的“详细信息”页面上都有“编辑此”按钮。我的客户在提交正确的数据后突然希望所有表单重定向到他的来源。
所以我想我可以在会话中保存原点然后重定向,但我想以一种通用的方式来做,比如在每个允许输入“编辑”或“创建”或任何东西的操作上,我会这样做:

$this->get('session')->set(
    'formOrigin', 
    [
        'route' => $this->get('request')->get('_route'),
        'arguments' => ???
    ]
)

然后在处理完表单中的数据后,从会话中获取来源,如果不为空

return $this->redirectToRoute($formOrigin['route'], $formOrigin['arguments']);

但问题是代码中的??? :) 你能在这里给我一个提示吗?

为了澄清,我可以“从某个地方”获取路由参数作为数组,还是我每次都必须自己构建它?我可以构建它,但对我来说它看起来很丑......

【问题讨论】:

  • 你能把referer用作$request->headers->get('referer')吗?

标签: php symfony session routing


【解决方案1】:

为什么不在会话中存储refrer

$referer = $request->headers->get('referer');
$this->get('session')->set('referer', $referer);

当成功提交表单后进入对象编辑并重定向到它。

或者你可以从$request对象获取Route参数:

$routeParams = $request->attributes->get('_route_params');

【讨论】:

    【解决方案2】:

    为了简单,你可以使用监听器:

    创建一个侦听器来侦听您的请求并将路由存储在会话中

    例如在您的 bundleName/Resources/config/services.yml 中

    services:
        redirect_listener:
            class: BundleName\EventListener\RedirectListener
            arguments: ['@service_container']
            tags:
                - {name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
    

    BundleName/EventListener/RedirectListener.php

    use Symfony\Component\DependencyInjection\ContainerInterface;
    use Symfony\Component\HttpFoundation\Session\Session;
    use Symfony\Component\HttpKernel\Event\GetResponseEvent;
    
    class RedirectionListener
    {
        protected $session;
    
        public function __construct(ContainerInterface $containerInterface)
        {
            $this->session = $containerInterface->get('session');
        }
    
        /**
         * @param GetResponseEvent $event
         */
        public function onKernelRequest(GetResponseEvent $event)
        {
            $route = $event->getRequest()->attributes->get('_route');
    
            if($this->session->has('route')) $this->session->remove('route');
    
            // Add route in session
            $this->session->add('route', $route);
        }
    
    
    
    }
    

    在你的控制器中处理数据后你可以重定向

    class YourController extends Controller
    {
    
        public function yourHandleFormAction()
        {
            // After handling data
            $this->redirect($this->get('session')->get('route'));
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-04-30
      • 2013-03-04
      • 1970-01-01
      • 2019-01-27
      • 2015-01-29
      • 2016-04-13
      • 2020-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多