67

我有一个 Symfony2 (2.2) 的应用程序。当我想发送邮件时,我遇到了路径问题,这些路径都是相对路径,显然在电子邮件中不起作用

用于渲染我正在使用的路径:

<a href="{{ path('route_name', {'param' : value}) }}">A link</a>

对于资产:

<img src="{{ asset('bundle/myname/img/image.gif') }}" alt="Title"/>

前面的示例工作正常,但路径是相对的,因此我需要附加域。我可以做类似的事情:

<a href="http://domain.com{{ path('route_name', {'param' => param1}) }}">A link</a>

但这不是我的问题的最佳解决方案,因为我有不同的域。

更新

我找到了具有该功能的路径的解决方案,url但我仍然需要资产的解决方案。

4

9 回答 9

128

Symfony 2.7 有一个新的absolute_url可以用来生成绝对 url。 http://symfony.com/blog/new-in-symfony-2-7-the-new-asset-component#template-function-changes

它适用于这两种情况或路径字符串:

<a href="{{ absolute_url(path('route_name', {'param' : value})) }}">A link</a>

对于资产:

<img src="{{ absolute_url(asset('bundle/myname/img/image.gif')) }}" alt="Title"/>

或者对于任何字符串路径

<img src="{{ absolute_url('my/absolute/path') }}" alt="Title"/>

在那些树案例上,您最终会得到一个绝对 URL,例如

http://www.example.com/my/absolute/path
于 2015-09-24T20:02:12.843 回答
84

Symfony 2.7 和更新版本

在这里看到这个答案。

第一个工作选项

{{ app.request.scheme ~'://' ~ app.request.httpHost ~ asset('bundles/acmedemo/images/search.png') }}

第二个工作选项 - 首选

刚刚使用全新的 Symfony 副本进行了快速测试。还有另一种结合方案和httpHost的选项:

{{ app.request.getSchemeAndHttpHost() ~ asset('bundles/acmedemo/images/search.png') }}
{# outputs #}
{# http://localhost/Symfony/web/bundles/acmedemo/css/demo.css  #}
于 2013-06-11T17:19:05.107 回答
53

来自Symfony2 文档:Symfony 2.5 中引入了资产的绝对 URL。

如果您需要资产的绝对 URL,您可以将第三个参数(或绝对参数)设置为 true:

例子:

<img src="{{ asset('images/logo.png', absolute=true) }}" alt="Symfony!" />
于 2014-08-08T16:43:43.853 回答
27

丹尼尔的回答现在似乎工作正常,但请注意,asset现在不推荐使用 twig 的函数生成绝对网址:

已弃用 - 使用 Twig asset() 函数生成绝对 URL 在 2.7 中已弃用,并将在 3.0 中删除。请改用 absolute_url()。

这是官方公告:http ://symfony.com/blog/new-in-symfony-2-7-the-new-asset-component#template-function-changes

你必须使用absolute_url树枝功能:

{# Symfony 2.6 #}
{{ asset('logo.png', absolute = true) }}

{# Symfony 2.7 #}
{{ absolute_url(asset('logo.png')) }}

有趣的是,它也适用于path函数:

{{ absolute_url(path('index')) }}
于 2015-07-20T18:53:40.540 回答
13

您可能想要使用该assets_base_urls配置。

framework:
    templating:
        assets_base_urls:
            http:   [http://www.website.com]
            ssl:   [https://www.website.com]

http://symfony.com/doc/current/reference/configuration/framework.html#assets


请注意,自Symfony 2.7以来配置有所不同:

framework:
    # ...
    assets:
        base_urls:
            - 'http://cdn.example.com/'
于 2013-06-11T18:24:52.887 回答
4

可以有http://test_site.comhttps://production_site.com。然后硬编码网址是一个坏主意。我建议这样做:

{{app.request.scheme ~ '://' ~ app.request.host ~ asset('bundle/myname/img/image.gif')}}
于 2014-03-26T10:05:12.517 回答
3

以下对我有用:

<img src="{{ asset('bundle/myname/img/image.gif', null, true) }}" />
于 2014-07-24T14:19:43.203 回答
1

我使用了文档https://symfony.com/doc/current/console/request_context.html中的以下建议来获取电子邮件中的绝对 URL:

# config/services.yaml
parameters:
    router.request_context.host: 'example.org'
    router.request_context.scheme: 'https'
于 2018-07-26T21:45:21.210 回答
1

使用命令生成绝对 URL 的附加信息(例如发送电子邮件)

在命令中,{{ absolute_url(path('index')) }}不是开箱即用的。

您将需要添加 antongorodezkiy 的答案中显示的附加配置。

但是如果您不想更改配置,因为您不确定它会如何影响整个应用程序,您可以在命令中配置路由器。

这是文档:

https://symfony.com/doc/3.4/console/request_context.html

这是代码:

use Symfony\Component\Routing\RouterInterface;
// ...

class DemoCommand extends Command
{
    private $router;

    public function __construct(RouterInterface $router)
    {
        parent::__construct();

        $this->router = $router;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $context = $this->router->getContext();
        $context->setHost('example.com');
        $context->setScheme('https');
        $context->setBaseUrl('my/path');

        $url = $this->router->generate('route-name', ['param-name' => 'param-value']);
        // ...
    }
}

在 Twig 模板中生成 URL

<a href="{{ absolute_url(path(...)) }}"></a>

您可以从 env 文件中获取 HOST 和 SCHEME

$context = $this->router->getContext();
$context->setHost($_ENV['NL_HOST']);
$context->setScheme($_ENV['NL_SCHEME']);

只需在 .env 和 .env.local 文件中定义变量

NL_HOST=mydomain.com
NL_SCHEME=https
于 2020-06-10T11:26:55.273 回答