返回

如何解决 Symfony Twig 中 URL 自动生成子域的问题?

php

如何在 Symfony Twig 中生成与子域相同的 URL

问题

当你使用 Symfony Twig 渲染组件时,生成的 URL 会包含子域。然而,你希望生成与主域相同的 URL,就像组件在主域上呈现时一样。

解决方法

有多种方法可以解决此问题:

方法 1:使用 URL 生成器服务

你可以使用 Symfony 的 URL 生成器服务手动生成包含主域 URL 的 URL:

{% set url = url('help', {}, 'https://main.com') %}

方法 2:覆盖 Twig URL 函数

你可以覆盖 Twig 的 url 函数以返回包含主域 URL 的 URL:

// 在 src/Twig/UrlExtension.php 中
class UrlExtension extends RoutingExtension
{
    public function __construct(UrlGeneratorInterface $urlGenerator)
    {
        parent::__construct($urlGenerator);
        $this->setHost('main.com');
    }
}

方法 3:使用 Twig 扩展

你可以创建一个 Twig 扩展来提供额外的 URL 功能,包括生成包含主域 URL 的 URL:

// 在 src/Twig/UrlExtension.php 中
class UrlExtension extends AbstractExtension
{
    public function getFunctions(): array
    {
        return [
            new TwigFunction('url', [$this, 'getUrl']),
        ];
    }

    public function getUrl(string $name, array $parameters = [], string $schemeAndHost = null): string
    {
        return $this->urlGenerator->generate($name, $parameters, UrlGeneratorInterface::ABSOLUTE_URL, $schemeAndHost);
    }
}

比较解决方案

这三个解决方案各有优点和缺点:

  • 方法 1: 简单易用,但需要在每次调用 url 函数时指定主域。
  • 方法 2: 覆盖 url 函数提供了更方便的解决方案,但需要修改 Twig 核心代码。
  • 方法 3: 使用 Twig 扩展提供了可重用性和灵活性,但需要编写更多代码。

根据你的具体情况,你可以选择最适合你的解决方案。

常见问题解答

  1. 为什么 Twig 自动生成包含子域的 URL?
    因为 Twig 默认使用请求的 URL 中的主机名来生成 URL。

  2. 这三个解决方案有什么区别?
    方法 1 手动生成 URL,方法 2 覆盖 Twig 函数,方法 3 使用 Twig 扩展。

  3. 哪个解决方案最适合我?
    如果需要简单易用的解决方案,请选择方法 1。如果需要覆盖 url 函数的更方便的方法,请选择方法 2。如果需要可重用性和灵活性,请选择方法 3。

  4. 如何创建 Twig 扩展?
    在你的项目中创建一个 PHP 类,扩展 AbstractExtension 类,并添加一个 getFunctions() 方法。

  5. 如何覆盖 Twig 函数?
    在你的服务配置文件中注册一个服务,该服务扩展 RoutingExtension 类,并覆盖 setHost() 方法。