Twig/Symfony 2中运算符的实例?
我有一个这样的混合数组(手机号码和实体): 在我的Twig模板中,如果Twig/Symfony 2中运算符的实例?,symfony,twig,Symfony,Twig,我有一个这样的混合数组(手机号码和实体): 在我的Twig模板中,如果target是Customer,我必须调用getMobile(),或者如果它实际上是一个数字(string),我必须打印该数字 Twig中是否有类似于instanceof操作符的东西 <ul> {% for target in targets %} <li>{{ target instance of MyEntity ? target.getMobile : target }}</li>
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>
{targets%中的目标为%s}
- {{MyEntity的目标实例?target.getMobile:target}
{%else%}
- 什么也没找到
像这样使用:
{{ target.mobile|default(target) }}
在\Twig\u扩展中,您可以添加测试
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;
}
然后使用like
{% if value is instanceof('DateTime') %}
很老了,但我在这里看不到实现这一点的更好的可能性: 性:
public function __toString()
{
return 'NameOfYourEntity';
}
细枝:
另一个解决方案:
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 ... }}
或
这里有一个很好的方法可以在带有扩展名的细枝中执行instanceof操作符: 1) 在需要的位置创建扩展文件 (例如:src/OC/YourBundle/Twig/InstanceOfExtension.php) 有了\Twig\u扩展,您可以做很多事情,如过滤、功能,但现在我们将创建一个测试 因此,我们实现函数getTests(),并在其中创建一个新的\Twig\u SimpleTest 第一个片段是您创建的测试的名称,第二个片段是可调用的。 (可以是函数(){}) 3) 然后像这样用在树枝上
来源于Adrien Brault=>其他不含反射类的溶液,带细枝过滤器: 首先,您需要一个TwigExtension类。然后,添加一个函数作为细枝过滤器或细枝函数
namespace-App\Twig;
使用Twig\Extension\AbstractExtension;
使用细枝\细枝过滤器;
使用细枝\细枝功能;
类TwigExtension扩展了AbstractExtension
/**
*@return array |\Twig_Filter[]
*/
公共函数getFilters()
{
返回[
新TwigFilter('is_instance_of',[$this,'isInstanceOf']))
];
}
/**
*@param$object
*@param$class
*@returnbool
*/
公共函数isInstanceOf($object,$class):bool
{
返回值为a($object,$class,true);
}
}
在细枝模板中:
{% if true is same as (object|is_instance_of('ClassName')) %}
// do some stuff
{% endif %}
选中由于PHP 5.5.0,您可以在下一步比较类名:
{{ constant('class', exception) is constant('\\Symfony\\Component\\HttpKernel\\Exception\\HttpException') }}
在需要严格比较类名的特定情况下,此代码段会有所帮助。如果您需要检查接口的实现或检查继承,最好创建上面描述的细枝扩展。我的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文档,我有了自己的解决方案:
迭代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;
}
}
小枝
我认为这不是他想要的。看起来\Twig\u Function\u方法已被弃用。我希望在当前版本的Twig中做到这一点-任何关于如何复制的指针?Twig_Filter_method for me\Twig_SimpleTest()有效(来自Zombkey的答案)这在Twig上下文中如何可用?这个答案对我有效,唯一不同的是使用@valdas.mistolisac的isInstanceOf方法,这个代码对我不起作用。你确定,它起作用了吗?你的小枝版本是什么?
{{ myvar is instanceof('\\OC\\YourBundle\\Entity\\YourEntityOrWhatEver') }}
{% if true is same as (object|is_instance_of('ClassName')) %}
// do some stuff
{% endif %}
{{ constant('class', exception) is constant('\\Symfony\\Component\\HttpKernel\\Exception\\HttpException') }}
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;
}
}
{% if value is instanceof('DateTime') %}
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 %}