我正在 Symfony3 中制作一个应用程序。应用程序的一部分由动态子域划分 --- 子域由 slug 表示。
subdomains:
host: "{slug}.{domain}"
default:
slug: example
...
当在本地运行时,此类路线的示例如下: http://a.localhost
当我在 Twig 中使用 {{ url('route') }}
或 {{ path('route') }}
创建链接时,子域名总是被忘记,参数中的slug会变成默认的example,总是使路由http://example.localhost
。
有没有办法隐式复制参数,或将某些参数标记为持久,这样我就不必使所有链接都包含 slug 像这样 {{ url(' route', {'slug' : slug}) }}
,以便留在子域上?
谢谢
最佳答案
我创建了一个TwigExtension用于在子域内生成链接。
我希望如果可以使某些参数“持久化”,正如我在问题中提到的那样。这些将隐式地跨相对路径进行,但可能通过显式参数选择而清空。如果这是不可能的,我认为这是比手动添加参数更好的选择,也是迄今为止最好的选择。
扩展类
/**
* ApplicationExtension constructor.
*
* @param Router $router
* @param RequestStack $requestStack
*/
public function __construct(Router $router, RequestStack $requestStack)
{
$this->router = $router;
$this->requestStack = $requestStack;
}
public function getFunctions()
{
return [
new \Twig_SimpleFunction('domainPath', [
$this,
'domainPath'
]),
];
}
public function domainPath($route_name, $params = [])
{
if (!array_key_exists('slug', $params)) {
$params['slug'] = $this->requestStack->getCurrentRequest()->attributes->get('slug');
}
return $this->router->generate($route_name, $params);
}
public function getName()
{
return 'application_extension';
}
注册服务(DI 和标签)
application.twig.application_extension:
class: ApplicationBundle\Twig\ApplicationExtension
arguments: ["@router", "@request_stack"]
public: false
tags:
- { name: twig.extension }
在模板中使用
{{ domainPath('route_name') }}
关于parameters - 交响乐, Twig : Persistent route parameters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35894548/