如何在树枝函数中使用绝对路径

时间:2013-06-11 16:58:45

标签: symfony routing twig

我有一个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功能的路径的解决方案,但我仍然需要资产解决方案。

9 个答案:

答案 0 :(得分:106)

Symfony 2.7有一个新的 absolute_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"/>

在这些树案例中,您最终会得到像

这样的绝对网址
http://www.example.com/my/absolute/path

答案 1 :(得分:78)

适用于Symfony 2.7及更新版

请在此处查看this

第一个工作选项

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

第二个工作选项 - 首选

刚刚使用干净的新Symfony副本进行了快速测试。还有another option结合了scheme和httpHost:

{{ app.request.getSchemeAndHttpHost() ~ asset('bundles/acmedemo/images/search.png') }}
{# outputs #}
{# http://localhost/Symfony/web/bundles/acmedemo/css/demo.css  #}

答案 2 :(得分:51)

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

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

示例:

<img src="{{ asset('images/logo.png', absolute=true) }}" alt="Symfony!" />

答案 3 :(得分:23)

Daniel's answer目前似乎工作正常,但请注意,现在不推荐使用twig&#39; asset函数生成绝对网址:

  

DEPRECATED - 使用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')) }}

答案 4 :(得分: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/'

答案 5 :(得分:3)

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

{{app.request.scheme ~ '://' ~ app.request.host ~ asset('bundle/myname/img/image.gif')}}

答案 6 :(得分:3)

以下适用于我:

<img src="{{ asset('bundle/myname/img/image.gif', null, true) }}" />

答案 7 :(得分: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'

答案 8 :(得分:0)

使用命令生成绝对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>

您可以从环境文件中获取主机和计划

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

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

NL_HOST=mydomain.com
NL_SCHEME=https