如何在Symfony2中的路由配置中使用cookie?

时间:2013-03-25 16:36:16

标签: symfony cookies routing

我在Cookie中存储了City参数。我希望将其值作为模式前缀包含在我的路由配置中,如下所示:

# MyBundle/Resources/config/routing.yml

MyBundle_hotel:
    resource: "@MyBundle/Resources/config/routing/hotel.yml"
    prefix:   /%cityNameFromCookie%/hotel

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

给我们一个关于你希望如何工作的用例,因为我没有看到困难。路由由您可以通过generateUrl函数,url twig函数或path twig函数指定的参数组成。

在Twig中你可以做到这一点

{{ path('MyBundle_hotel', {cityNameFromCookie: app.request.cookies.get('cityNameFromCookie')}) }}

在控制器操作中

$cookieValue = $this->get('request')->cookies->get('cityNameFromCookie');
$url = $this->generateUrl('MyBundle_hotel', array('cityNameFromCookie' => $cookieValue));

或从任何可以访问容器的地方

$cookieValue = $this->container->get('request')->cookies->get('cityNameFromCookie');
$url = $this->container->get('router')->generate('MyBundle_hotel', array('cityNameFromCookie' => $cookieValue));

在上一个示例中,您可能希望更改容器的访问方式。

如果您担心它看起来有多复杂,您可以抽象这个逻辑并将其放在服务中或扩展router服务。

您可以找到有关services and the service container in the Symfony's documentation

的文档

您还可以通过命令php app/console container:debug列出服务,并找到router服务及其命名空间,然后您可以尝试找出如何扩展router服务(了解服务如何运作的一种非常好的方法。

否则,这是创建服务的简单方法。

在您的services.yml中(在您的Bundle或app / config / config.yml中)

services:
    city:
        class: MyBundle\Service\CityService
        arguments: [@router, @request]

CityService班级

namespace MyBundle\Service

class CityService
{

    protected $router;
    protected $request;

    public function __construct($router, $request) 
    {
        $this->router = $router;
        $this->request = $request;
    }

    public function generateUrl($routeName, $routeParams, $absoluteUrl)
    {
        $cookieValue = $this->request->cookies->get('cityNameFromCookie');

        $routeParams = array_merge($routeParams, array('cityNameFromCookie' => $cookieValue));

        return $this->router->generateUrl($routeName, $routeParams, $absoluteUrl);
    }
}

您可以访问容器的任何地方,您将能够执行以下操作

$this->container->get('city')->generateUrl('yourroute', $params);

如果你仍然认为这不是一个好的解决方案;你将不得不扩展路由器服务(或者找到一种更好的方法来扩展路由器组件,使其表现得像你期望的那样)。

我个人使用上面的方法,因此我可以将实体传递给Twig中的path方法。您可以在MainService class中定义的PathExtension Twig classservices.yml中找到一个示例。

在Twig中,我可以forum_path('routename', ForumEntity),在容器感知环境中我可以$this->container->get('cornichon.forum')->forumPath('routename', ForumEntity)

您应该有足够的信息来做出明智的决定