我在Cookie中存储了City
参数。我希望将其值作为模式前缀包含在我的路由配置中,如下所示:
# MyBundle/Resources/config/routing.yml
MyBundle_hotel:
resource: "@MyBundle/Resources/config/routing/hotel.yml"
prefix: /%cityNameFromCookie%/hotel
我怎样才能做到这一点?
答案 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 class和services.yml中找到一个示例。
在Twig中,我可以forum_path('routename', ForumEntity)
,在容器感知环境中我可以$this->container->get('cornichon.forum')->forumPath('routename', ForumEntity)
。
您应该有足够的信息来做出明智的决定