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