返回
如何解决 Symfony Twig 中 URL 自动生成子域的问题?
php
2024-03-18 05:34:54
如何在 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 扩展提供了可重用性和灵活性,但需要编写更多代码。
根据你的具体情况,你可以选择最适合你的解决方案。
常见问题解答
-
为什么 Twig 自动生成包含子域的 URL?
因为 Twig 默认使用请求的 URL 中的主机名来生成 URL。 -
这三个解决方案有什么区别?
方法 1 手动生成 URL,方法 2 覆盖 Twig 函数,方法 3 使用 Twig 扩展。 -
哪个解决方案最适合我?
如果需要简单易用的解决方案,请选择方法 1。如果需要覆盖url
函数的更方便的方法,请选择方法 2。如果需要可重用性和灵活性,请选择方法 3。 -
如何创建 Twig 扩展?
在你的项目中创建一个 PHP 类,扩展AbstractExtension
类,并添加一个getFunctions()
方法。 -
如何覆盖 Twig 函数?
在你的服务配置文件中注册一个服务,该服务扩展RoutingExtension
类,并覆盖setHost()
方法。