Symfony,Twig:持久路由参数

时间:2016-03-09 14:36:24

标签: parameters routes twig slug symfony

我在Symfony3中制作应用程序。部分应用程序由动态子域划分 - 子域由段塞表示。

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

当在这样的路线的本地示例上运行时,例如http://a.localhost

当我在Twig中创建链接时,使用{{ url('route') }}{{ path('route') }},子域始终忘记,并且参数中的slug会降为默认示例< / em>,始终制作路线http://example.localhost

有没有办法隐式复制参数,或者标记一些持久的参数,这样我就不必像所有{{ url('route', {'slug' : slug}) }}那样使所有的链接都包含了slug ,按顺序留在子域?

谢谢

1 个答案:

答案 0 :(得分:2)

我创建了一个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') }}