Symfony2和Twig -检查资源是否存在


Symfony2 and Twig - Check if an asset exists

我有一个使用twig模板的symfony2项目。

我正在显示一些图像,并希望仅在特定资产存在时才显示图像。

我有这个:

{% if asset('bundles/sciforumversion2/images/logos/'~conf.img) %}
    <img style="width: 60px; float:right; margin-right: 15px;" src="{{ asset('bundles/sciforumversion2/images/logos/')}}{{ conf.img }}"/>
{% endif %}

但是if条件总是为真。

有什么想法吗?谢谢你。

如果你想检查一个资产是否存在,你可以创建一个Twig扩展来实现这个功能。

PHPTwig'Extension目录中创建AssetExistsExtension.php,包含以下内容:

<?php
namespace Fuz'TestBundle'Twig'Extension;
use Symfony'Component'HttpKernel'KernelInterface;
class AssetExistsExtension extends 'Twig_Extension
{
    private $kernel;
    public function __construct(KernelInterface $kernel)
    {
        $this->kernel = $kernel;
    }
    public function getFunctions()
    {
        return array(
                'asset_exists' => new 'Twig_Function_Method($this, 'asset_exists'),
        );
    }
    public function asset_exists($path)
    {
        $webRoot = realpath($this->kernel->getRootDir() . '/../web/');
        $toCheck = realpath($webRoot . $path);
        // check if the file exists
        if (!is_file($toCheck))
        {
            return false;
        }
        // check if file is well contained in web/ directory (prevents ../ in paths)
        if (strncmp($webRoot, $toCheck, strlen($webRoot)) !== 0)
        { 
            return false;
        }
        return true;
    }
    public function getName()
    {
        return 'asset_exists';
    }
}

YML这是要放在services.yml文件中的配置。

parameters:
    (...)
    fuz_tools.twig.asset_exists_extension.class: Fuz'TestBundle'Twig'Extension'Asset@ExistsExtension
services:
    (...)
    fuz_tools.twig.asset_exists_extension:
        class: '%fuz_tools.twig.asset_exists_extension.class%'
        arguments: ['@kernel']
        tags:
          - { name: twig.extension }

Twig要使用这个扩展,在Twig文件上,使用:

{% if asset_exists('bundles/fuztest/images/test.png') %}

注意:不要忘记替换名称空间以匹配您的项目

你的代码中有一个错别字:

fuz_tools.twig.asset_exists_extension.class: Fuz'TestBundle'Twig'Extension'AssetsExistsExtension
应该

fuz_tools.twig.asset_exists_extension.class: Fuz'TestBundle'Twig'Extension'AssetExistsExtension

Milos你好,我已经回答了这个问题:https://stackoverflow.com/a/14232207/875519

只要注册file_exists通过扩展Twig引擎,然后你就可以在Twig模板内测试^^