3

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

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

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

正如你所看到的,它试图包含一个远程树枝模板。这可能是因为 symfony 只是错误说它找不到模板吗?

树枝模板位置在我的代码中是正确的,因为我可以在浏览器中浏览到模板 url。

任何帮助都非常受欢迎。=)

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

4

1 回答 1

7

您可以创建一个函数来为您下载此文件,并使其可用于 twig。

想法:

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

目录

创建一个临时目录,使您的 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 文件之前对其进行远程包含,我认为这是一种奇怪的架构。

无论如何,您的问题很有趣,祝您实施顺利。

于 2013-09-26T22:36:33.330 回答