Symfony、Twig:持久路由参数

Symfony, Twig: Persistent route parameters

我正在用 Symfony3 制作一个应用程序。应用程序的一部分由动态子域分割 --- 子域由一个 slug 表示。

subdomains:
     host: "{slug}.{domain}"
     default:
           slug: example
     ...

当 运行 在此类路线的本地示例中,例如http://a.localhost

当我在 Twig 中创建 link 时,使用 {{ url('route') }}{{ path('route') }},子域总是 被遗忘 ,然后插入参数变为默认值 示例 ,始终生成路由 http://example.localhost.

有没有办法隐式复制参数,或将某些参数标记为持久性,这样我就不必让所有 link 都包含 slug像这样 {{ url('route', {'slug' : slug}) }},以便留在子域中?

谢谢

我创建了一个 TwigExtension 用于在子域内生成链接。

如果可以像我在问题中提到的那样制作一些参数"persistent",我会更愿意。这些将隐式地跨相对路径进行,但可能会因显式参数选择而无效。如果这是不可能的,我认为这是比手动添加参数更好的选择,也是迄今为止最好的选择。

扩展名class

/**
 * 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') }}