我有一个像这样的混合阵列(手机号码和实体):
$targets = array();
$targets[] = '+32647651212';
$targets[] = new Customer();
在我的Twig模板中,如果getMobile()
是target
,我必须致电Customer
,或者如果它实际上是一个数字(string
),则只需打印该号码。
Twig中有instanceof
运算符吗?
<ul>
{% for target in targets %}
<li>{{ target instance of MyEntity ? target.getMobile : target }}</li>
{% else %}
<li>Nothing found.</li>
</ul>
答案 0 :(得分:36)
在\ 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') %}
答案 1 :(得分:15)
这是使用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);
}
}
(例如: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') }}
Adrien Brault的来源=&gt; https://gist.github.com/adrienbrault/7045544
答案 2 :(得分:1)
没有ReflectionClass的其他解决方案:
/**
* @param $object
* @param $class
* @return bool
*/
public function isInstanceOf($object, $class)
{
return is_a($object, $class, true) ? true: false;
}
答案 3 :(得分:1)
从PHP 5.5.0开始,您可以使用以下方式比较类名:
auto
在需要严格比较类名的特定情况下,此片段可以提供帮助。如果您需要检查接口的实现或检查继承,最好创建上述的树枝扩展。
答案 4 :(得分:0)
另一种解决方案:
class A {
...
public function isInstanceOfB() {
return $this instanceof B;
}
}
class B extends A {}
class C extends A {}
然后在你的树枝上:
{{ 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 %}
答案 5 :(得分:0)
我的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;
}
}
3)然后使用相同的valdas.mistolis答案代码:
{% if value is instanceof('DateTime') %}
4)感谢valdas.mistolis和symfony文档,我得到了自己的解决方案: Twig Extension templating
答案 6 :(得分:0)
另一个通过Symfony表单进行迭代的示例:
namespace App\Twig;
use Twig\Extension\AbstractExtension;
use Twig\TwigTest;
use App\Document\Embeded\Image;
use App\Document\Embeded\Gallery;
use App\Document\Embeded\Article;
class AppExtension extends AbstractExtension
{
public function getTests()
{
return [
new TwigTest('image', [$this, 'isImage']),
new TwigTest('gallery', [$this, 'isGallery']),
new TwigTest('article', [$this, 'isArticle']),
];
}
public function isImage($var) {
return $var instanceof Image;
}
public function isGallery($var) {
return $var instanceof Gallery;
}
public function isArticle($var) {
return $var instanceof Article;
}
}
嫩枝
{% if form.vars.data is gallery %}
This is a Gallery
{% elseif form.vars.data is article %}
This is an Article
{% endif %}
答案 7 :(得分:-4)
像这样使用default
filter in Twig:
{{ target.mobile|default(target) }}
答案 8 :(得分:-8)
相当古老,但我在这里看不到更有可能实现这个目标:
Enity:
public function __toString()
{
return 'NameOfYourEntity';
}
嫩枝:
{{ entity }}