在Symfony 2.3中使用Twig我需要能够在树枝模板中选择远程资源。
所以我有一个带有这样一个体块的树枝模板:
{% block body %}
{% include 'http://asset.remotelocation.co.uk/template.html.twig' %}
{% endblock %}
并且您可以看到它尝试包含远程树枝模板。这是可能的,因为symfony只是错误,说它无法找到模板吗?
我的代码中的树枝模板位置正确,因为我可以浏览浏览器中的模板网址。
任何帮助都很明确。 =)
P.S远程位置只是我们持有共享资产的其他网络服务器之一。
答案 0 :(得分:5)
您可以创建一个将为您下载此文件的功能,并使其可用于树枝。
这个想法:
app/Resources/views/temp
,因此可以在:temp:file.html.twig
remote_file()
函数来包装第一个include
的参数temp
目录中以随机名称:temp:file.html.twig
)创建临时目录,以便symfony目录树如下所示:
在您的包中,创建一个Twig\Extension
目录。在那里,使用以下代码创建RemoteFileExtension.php
文件。注意:不要忘记更换我的命名空间。
<?php
namespace Fuz\TestBundle\Twig\Extension;
use Symfony\Component\HttpKernel\KernelInterface;
class RemoteFileExtension extends \Twig_Extension
{
private $kernel;
public function __construct(KernelInterface $kernel)
{
$this->kernel = $kernel;
}
public function getFunctions()
{
return array(
'remote_file' => new \Twig_Function_Method($this, 'remote_file'),
);
}
public function remote_file($url)
{
$contents = file_get_contents($url);
$file = $this->kernel->getRootDir() . "/Resources/views/temp/" . sha1($contents) . '.html.twig';
if (!is_file($file))
{
file_put_contents($file, $contents);
}
return ':temp:' . basename($file);
}
public function getName()
{
return 'remote_file';
}
}
在services.yml
配置文件中,添加以下内容:
低于parameters
:
fuz_tools.twig.remote_file_extension.class: Fuz\TestBundle\Twig\Extension\RemoteFileExtension
低于services
:
fuz_tools.twig.remote_file_extension:
class: '%fuz_tools.twig.remote_file_extension.class%'
arguments: ['@kernel']
tags:
- { name: twig.extension }
我创建了一个现有的http://localhost:8888/test.html.twig
。它只包含:
Hello, {{ name }}!
在我的应用程序中,我添加了以下行:
{% include remote_file('http://localhost:8888/test.html.twig') with {'name': 'Alain'} %}
当我运行我的代码时,我得到:
您应该考虑将twig文件作为应用程序的一部分。 twig文件不是资产,因为它需要由Symfony2,一些逻辑,一些优化等来解释。你所做的实际上与执行它之前的PHP文件的远程包含相当,我认为是奇怪的架构。
无论如何,你的问题很有意思,祝你好好实施。