检查方法是否存在或是否可以在树枝中调用

时间:2014-08-20 15:36:39

标签: php html twig

如果在一个树枝内我有一个我想要测试的对象,如果可以在该对象上调用一个名为getName的方法,是否有这种情况?

我尝试了以下操作但没有取得任何成功:

 {% if lastCategory.method(getName) is defined  %}

5 个答案:

答案 0 :(得分:2)

是的,你可以这样做:

{{ attribute(object, method) is defined ? 'Method exists' : 'Method does not exist' }}

在你的情况下,它会像

{{ attribute(lastCategory, 'getName') is defined ? 'Method exists' : 'Method does not exist' }}

请参阅documentation

答案 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。