使用twig从视图中获取http referer URI

时间:2016-02-10 20:20:36

标签: twig symfony

我想在Twig中知道用户来自哪个URI。例如:

  1. 用户位于页面/ en /使用条款(' app_default_terms')
  2. 用户点击登录
  3. 在注册页面上有一个隐藏的输入,可以将用户从他来的地方发回<input type="hidden" name="_target_path" value="{{ get_uri_from_where_he_came() }}" />

  4. 他提交表格并发回。

  5. 我的问题是,这个枝条功能是什么?

2 个答案:

答案 0 :(得分:10)

使用symfony框架,您可以访问一个特殊的全局变量app,该变量将请求保存在其他属性中。

请参阅http://symfony.com/doc/current/book/templating.html#global-template-variables

所以你可以使用类似的东西:

{% set referer = app.request.server.get('http-referer')|default('/') %}

<input type="hidden" name="_target_path" value="{{ referer }}" />

答案 1 :(得分:3)

我的建议有点过度杀戮但确保您不依赖来自用户的任意数据。

想法

您始终使用事件侦听器在应用程序中保存以前的路径;并实现一个/reload路径,将用户发送回该路由。登录成功后,您只需将用户重定向到/reload路径,就可以了。

实施

更改名称空间以适合您的应用程序。

LastRouteListener.php

<?php

namespace Fuz\QuickStartBundle\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Fuz\QuickStartBundle\Services\Routing;

class LastRouteListener implements EventSubscriberInterface
{
    protected $routing;

    public function __construct(Routing $routing)
    {
        $this->routing = $routing;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        $request = $event->getRequest();
        if (!$request->hasPreviousSession()) {
            return;
        }

        try {
            $currentRoute = $this->routing->getCurrentRoute($request);
        } catch (ResourceNotFoundException $ex) {
            return;
        }
        if (is_null($currentRoute)) {
            return;
        }

        $session       = $request->getSession();
        $previousRoute = $session->get('current_route', array());
        if ($currentRoute == $previousRoute) {
            return;
        }

        $session->set('previous_route', $previousRoute);
        $session->set('current_route', $currentRoute);
    }

    public static function getSubscribedEvents()
    {
        return array(
            KernelEvents::REQUEST => array(array('onKernelRequest', 15)),
        );
    }
}

services.yml

parameters:
    # ...
    quickstart.last_route.listener.class: Fuz\QuickStartBundle\EventListener\LastRouteListener

services:
    # ...

    quickstart.last_route.listener:
        class: %quickstart.last_route.listener.class%
        arguments: [@quickstart.routing]
        tags:
            - { name: kernel.event_subscriber }

ReloadController.php

<?php

namespace Fuz\QuickStartBundle\Controller;

use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Fuz\QuickStartBundle\Base\BaseController;

class ReloadController extends BaseController
{
    /**
     * Get back to the previous route
     *
     * @Route("/reload", name="reload")
     * @Method({"GET"})
     */
    public function reloadAction(Request $request)
    {
        if ($request->getSession()->has('previous_route')) {
            $route                      = $request->getSession()->get('previous_route');
            $route['params']['_locale'] = $request->getLocale();

            return $this->redirect($this->generateUrl($route['name'], $route['params']));
        }

        return $this->redirect($this->generateUrl('home'));
    }
}

如果您想要实时查看此实现,可以从我的GitHub克隆“symfony-quickstart”。

https://github.com/ninsuo/symfony-quickstart