私はこのような混合配列(携帯電話番号とエンティティ)を持っています:
_$targets = array();
$targets[] = '+32647651212';
$targets[] = new Customer();
_
私のTwigテンプレートでは、target
がCustomer
の場合はgetMobile()
を呼び出すか、実際に数値の場合は数値を出力する必要があります( string
)。
Twigにinstanceof
演算子のようなものはありますか?
_<ul>
{% for target in targets %}
<li>{{ target instance of MyEntity ? target.getMobile : target }}</li>
{% else %}
<li>Nothing found.</li>
</ul>
_
\ Twig_Extensionで、テストを追加できます
public function getTests()
{
return [
'instanceof' => new \Twig_Function_Method($this, 'isInstanceof')
];
}
/**
* @param $var
* @param $instance
* @return bool
*/
public function isInstanceof($var, $instance) {
return $var instanceof $instance;
}
そして、次のように使用します
{% if value is instanceof('DateTime') %}
ここでは、instanceof演算子をtwig with Extension:
(例:src/OC/YourBundle/Twig/InstanceOfExtension.php)
\ Twig_Extensionを使用すると、フィルタリング、機能など、さまざまなことができますが、ここでテストを作成します。
そこで、関数getTests()を実装し、その中に新しい\ Twig_SimpleTestを作成します。
最初のarugmentは作成するテストの名前であり、2番目のarugmentは呼び出し可能です。 (function(){}にすることができます)。
<?php
namespace OC\YourBundle\Twig;
class InstanceOfExtension extends \Twig_Extension {
public function getTests() {
return array(
new \Twig_SimpleTest('instanceof', array($this, 'isInstanceOf')),
);
}
public function isInstanceOf($var, $instance) {
$reflexionClass = new \ReflectionClass($instance);
return $reflexionClass->isInstance($var);
}
}
(例:src/OC/YourBundle/Resources/config/services.yml)
services:
[...may you have other services ...]
app.twig_extension:
class: OC\YourBundle\Twig\InstanceOfExtension
public: false
tags:
- { name: twig.extension }
{{ myvar is instanceof('\\OC\\YourBundle\\Entity\\YourEntityOrWhatEver') }}
AdrienBraultからのソース=> https://Gist.github.com/adrienbrault/7045544
PHP 5.5.0なので、次の方法でクラス名を比較できます。
{{ constant('class', exception) is constant('\\Symfony\\Component\\HttpKernel\\Exception\\HttpException') }}
このスニペットは、クラス名を厳密に比較する必要がある特定の場合に役立ちます。インターフェイスの実装を確認したり、継承を確認したりする必要がある場合は、上記のtwig拡張機能を作成することをお勧めします。
ReflectionClassを使用しないその他のソリューション:
/**
* @param $object
* @param $class
* @return bool
*/
public function isInstanceOf($object, $class)
{
return is_a($object, $class, true) ? true: false;
}
別の解決策:
class A {
...
public function isInstanceOfB() {
return $this instanceof B;
}
}
class B extends A {}
class C extends A {}
次に、twig:
{{ a.isInstanceOfB ? ... something for B instance ... : ... something for C instance ... }}
OR
{% if a.isInstanceOfB %}
... do something for B instance ...
{% else %}
... do something for C instance ...
{% endif %}
Symfony4.3の私のソリューション
1)src/TwigフォルダーにAppExtensionクラスを作成します。 (クラスは自動的に検出されます)。
2)AbstractExtensionクラスを拡張します。
namespace App\Twig;
use Twig\Extension\AbstractExtension;
use Twig\TwigTest;
class AppExtension extends AbstractExtension
{
public function getTests()
{
return [
new TwigTest('instanceof', [$this, 'isInstanceof'])
];
}
/**
* @param $var
* @param $instance
* @return bool
*/
public function isInstanceof($var, $instance) {
return $var instanceof $instance;
}
}
3)次に、同じコードのvaldas.mistolisを使用します。
{% if value is instanceof('DateTime') %}
4)valdas.mistolisとsymfonyのドキュメントに感謝します。私は自分の解決策を手に入れました: Twig Extensionテンプレート