如果在一个树枝内我有一个我想要测试的对象,如果可以在该对象上调用一个名为getName的方法,是否有这种情况?
我尝试了以下操作但没有取得任何成功:
{% if lastCategory.method(getName) is defined %}
答案 0 :(得分:2)
是的,你可以这样做:
{{ attribute(object, method) is defined ? 'Method exists' : 'Method does not exist' }}
在你的情况下,它会像
{{ attribute(lastCategory, 'getName') is defined ? 'Method exists' : 'Method does not exist' }}
答案 1 :(得分:0)
这不是你应该在Twig模板中做的事情。请注意,如果您尝试访问不存在的内容,Twig将永远不会抛出错误。 foo.bar
是一个Twig表达式,转换为比$foo->bar()
复杂得多的东西。您的模板应如下所示:
{{ lastCategory.name }}
这几乎涵盖了所有理由:
lastCategory
是一个数组,name
是一个索引lastCategory
是一个对象
name
是属性name
是一种方法getName
是一种方法isName
是一种方法即使foo.bar.this.does.not.exist
永远不会抛出错误,它也不会做任何事情
如果您需要进行测试,只需执行以下操作:
{% if lastCategory.name %}
如果你想避免两次调用该方法(虽然这是糟糕的对象设计):
{% set name = lastCategory.name %}
{% if name %}
或许你正在寻找这个成语:
{{ lastCategory.name|default('No name') }}
答案 2 :(得分:0)
试试这个: {% if lastCategory.name is defined %}
。它工作
答案 3 :(得分:0)
只需创建Twig Extension并在模板{% if method_exists(lastCategory, 'getName') %}Yes{% else %}No{% endif %}
中使用
<?php
namespace AppBundle\Twig;
class SomeTwigExtension extends \Twig_Extension {
public function getFunctions()
{
return array(
'method_exists' => new \Twig_SimpleFunction('method_exists', array($this, 'isMethodExist'))
);
}
public function isMethodExist($object, $method)
{
return method_exists($object, $method);
}
public function getName()
{
return 'method_exists_twig_extension';
}
}
答案 4 :(得分:0)
我使用 answer 作为基础,但我使用 return method_exists($object, $method);
而不是 return isset($object->$method);
,例如第一个变体由于未知原因总是返回 false。