使用TWIG加载远程文件

时间:2013-09-26 14:15:15

标签: php twig symfony-2.3

在Symfony 2.3中使用Twig我需要能够在树枝模板中选择远程资源。

所以我有一个带有这样一个体块的树枝模板:

{% block body %}
    {% include 'http://asset.remotelocation.co.uk/template.html.twig' %}
{% endblock %}

并且您可以看到它尝试包含远程树枝模板。这是可能的,因为symfony只是错误,说它无法找到模板吗?

我的代码中的树枝模板位置正确,因为我可以浏览浏览器中的模板网址。

任何帮助都很明确。 =)

P.S远程位置只是我们持有共享资产的其他网络服务器之一。

1 个答案:

答案 0 :(得分:5)

您可以创建一个将为您下载此文件的功能,并使其可用于树枝。

这个想法:

  • 您创建了一个目录app/Resources/views/temp,因此可以在:temp:file.html.twig
  • 访问twig文件
  • 在你的twig文件中,你将使用remote_file()函数来包装第一个include的参数
  • 您的文件将由您的函数在temp目录中以随机名称
  • 下载
  • 您的函数将返回一个树枝路径以在本地访问该文件(:temp:file.html.twig
  • 不要忘记自动清除太旧的临时文件! (一个cron?)

目录

创建临时目录,以便symfony目录树如下所示:

enter image description here

扩展名

在您的包中,创建一个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'} %}

当我运行我的代码时,我得到:

enter image description here

更多笔记

您应该考虑将twig文件作为应用程序的一部分。 twig文件不是资产,因为它需要由Symfony2,一些逻辑,一些优化等来解释。你所做的实际上与执行它之前的PHP文件的远程包含相当,我认为是奇怪的架构。

无论如何,你的问题很有意思,祝你好好实施。