我有一个像这样的混合阵列(手机号码和实体):
$targets = array();
$targets[] = '+32647651212';
$targets[] = new Customer();
Run Code Online (Sandbox Code Playgroud)
在我的Twig模板中,我必须调用getMobile()if target是a Customer或只是打印数字,如果它实际上是一个数字(string).
instanceof在Twig中有类似操作符的东西吗?
<ul>
{% for target in targets %}
<li>{{ target instance of MyEntity ? target.getMobile : target }}</li>
{% else %}
<li>Nothing found.</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
val*_*lis 37
在\ 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;
}
Run Code Online (Sandbox Code Playgroud)
然后使用喜欢
{% if value is instanceof('DateTime') %}
Run Code Online (Sandbox Code Playgroud)
Zom*_*key 18
这里有一个使用Extension在twig中执行instanceof运算符的好方法:
(例如:src/OC/YourBundle/Twig/InstanceOfExtension.php)
使用\ Twig_Extension你可以做很多事情,过滤,功能,但现在我们将创建一个测试.
所以我们实现了函数getTests(),在其中我们创建了一个新的\ Twig_SimpleTest
第1个arugment是你创建的测试的名称,seconde是可调用的.(可以是函数(){}).
<?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);
}
}
Run Code Online (Sandbox Code Playgroud)
(例如: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 }
Run Code Online (Sandbox Code Playgroud)
{{ myvar is instanceof('\\OC\\YourBundle\\Entity\\YourEntityOrWhatEver') }}
Run Code Online (Sandbox Code Playgroud)
来自Adrien Brault => https://gist.github.com/adrienbrault/7045544
小智 8
我的 Symfony 4.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;
}
}
Run Code Online (Sandbox Code Playgroud)
3)然后使用valdas.mistolis答案的相同代码:
{% if value is instanceof('DateTime') %}
Run Code Online (Sandbox Code Playgroud)
4)感谢 valdas.mistolis 和 symfony 文档,我得到了自己的解决方案: Twig Extension 模板
从 PHP 5.5.0 开始,您可以通过以下方式比较类名:
{{ constant('class', exception) is constant('\\Symfony\\Component\\HttpKernel\\Exception\\HttpException') }}
Run Code Online (Sandbox Code Playgroud)
当您需要严格比较类名时,此代码片段可以在特定情况下提供帮助。如果您需要检查接口的实现或检查继承,最好创建上述的树枝扩展。
Ant*_*nko -6
default在 Twig 中使用过滤器,如下所示:
{{ target.mobile|default(target) }}
Run Code Online (Sandbox Code Playgroud)