アセットが存在するかどうかを確認したい場合は、関数を実装するための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') %}
注: プロジェクトに合わせて名前空間を置き換えることを忘れないでください。