使用 TWIG 加载远程文件
在 Symfony 2.3 中使用 Twig 我需要能够在 twig 模板中选择远程资源.
Using Twig in Symfony 2.3 I need to be able to select remote assets inside a twig template.
所以我有一个带有这样的主体块的树枝模板:
So I have a twig template with a body block like this:
{% block body %}
{% include 'http://asset.remotelocation.co.uk/template.html.twig' %}
{% endblock %}
你可以看到它试图包含一个远程树枝模板.这可能是因为 symfony 只是错误说它找不到模板吗?
and as you can see its trying to include a remote twig template. Is this possible as symfony just errors saying it cant find the template?
twig 模板位置在我的代码中是正确的,因为我可以在浏览器中浏览到模板 url.
The twig template location is correct in my code as I can browse to the template url in my browser.
任何帮助都非常受欢迎.=)
Any help is much appeciated. =)
P.S 远程位置只是我们持有共享资产的其他网络服务器之一.
P.S the remote location is just one of our other webserver where we hold shared assets.
推荐答案
您可以创建一个函数来为您下载此文件,并使其可用于 twig.
You can create a function that will download this file for you, and make it available for twig.
想法:
- 你创建一个目录
app/Resources/views/temp
,这样一个twig文件就可以在:temp:file.html.twig
- 在您的 twig 文件中,您将使用
remote_file()
函数来包装第一个include
的参数 - 您的文件将由您的函数在
temp
目录中以 随机 名称下载 - 您的函数将返回一个树枝路径以在本地访问文件(
:temp:file.html.twig
) - 不要忘记自动清除太旧的临时文件!(一个cron?)
- You create a directory
app/Resources/views/temp
, so a twig files can be accessed at:temp:file.html.twig
- In your twig file, you'll use a
remote_file()
function to wrap the firstinclude
's argument - Your files will be downloaded by your function inside
temp
directory with a random name - your function will return a twig path to access the file locally (the
:temp:file.html.twig
) - don't forget to automate something to clear too old temp files! (a cron?)
创建一个临时目录,让你的 symfony 目录树看起来像这样:
Create a temp directory so that your symfony directory tree looks like this:
在你的包中,创建一个 TwigExtension
目录.在那里,使用以下代码创建一个 RemoteFileExtension.php
文件.注意:不要忘记用你的替换我的命名空间.
Inside your bundle, create a TwigExtension
directory. There, create a RemoteFileExtension.php
file with the following code. Note: don't forget to replace my namespaces by yours.
<?php
namespace FuzTestBundleTwigExtension;
use SymfonyComponentHttpKernelKernelInterface;
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
配置文件中,添加以下内容:
Inside your services.yml
configuration file, add the following:
参数
下方:
fuz_tools.twig.remote_file_extension.class: FuzTestBundleTwigExtensionRemoteFileExtension
服务
下方:
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 }}!
在我的应用程序中,我输入了以下行:
Inside my application, I put the following line :
{% include remote_file('http://localhost:8888/test.html.twig') with {'name': 'Alain'} %}
当我运行我的代码时,我得到:
When I run my code, I get :
您应该考虑到 twig 文件是您的应用程序的一部分.twig 文件不是资产,因为它需要由 Symfony2 解释,有一些逻辑,有一些优化等等.你所做的实际上相当于在执行 PHP 文件之前对其进行远程包含,我认为这是一种奇怪的架构.
You should consider that a twig file takes part of your application. A twig file is not an asset, as it needs to be intepreted by Symfony2, with some logic, with some optimizations and so on. What you're doing actually is comparable to a remote include of a PHP file before executing it, strange architecture I think.
无论如何,您的问题很有趣,祝您实施顺利.
Anyway, your question was interesting, good luck for your implementation.
相关文章