1

在 Twig 中,如果存在正确的 getter,我如何列出对象中的所有键/值对(阅读:私有/受保护的属性)?

class MyObject
{
    protected $foo;

    public function __construct()
    {
        $this->foo = 'bar';
    }

    public function getFoo()
    {
        return $this->foo;
    }

}

在上面的示例中,我想获取“foo”(键)和“bar”(值)。树枝已经让我做类似myobject.foomyobject['foo']得到“酒吧”的事情。

以下不起作用(类似数组的语法):

{% for key, val in myobject %}
    {{ key }}={{ val }}
{% endfor %}

我应该实现Iterator接口还是有更好/原生的方式?

4

2 回答 2

3

这与 Twig 没有直接关系,而是 PHP 如何处理对象的迭代。

例如,如果你这样做会发生什么?

class MyObject
{
  protected $foo;

  public function __construct()
  {
    $this->foo = 'bar';
  }

  public function getFoo()
  {
    return $this->foo;
  }
}

$myObject = new MyObject();

foreach ( $myObject as $property => $value )
{
  echo "$property: $value<br>";
}

没有。齐尔奇。纳达。浏览器出现白屏。

但是,如果您将对象转换为数组,那么它可以工作

foreach ( (array) $myObject as $property => $value )
{
  echo "$property: $value<br>";
}

// *foo: bar

那个星号是怎么回事?稍后会详细介绍...

但是,您不能在 Twig 中使用 PHP 的显式类型转换。所以现在怎么办?输入迭代器聚合

class MyObject implements \IteratorAggregate
{
  protected $foo;

  public function __construct()
  {
    $this->foo = 'bar';
  }

  public function getFoo()
  {
    return $this->foo;
  }

  public function getIterator()
  {
    return new \ArrayIterator( (array) $this );
  }
}

但是,您仍然会遇到一个问题:该死的星号。它存在是因为MyObject::$foo-protected当类型从MyObject转换为array时,PHP 会自动执行此操作。所以现在怎么办?好吧,还有其他方法可以在对象上公开/创建迭代器。你总是可以“手动”做

  public function getIterator()
  {
    return new \ArrayIterator( array(
      'foo' => $this->getFoo()
    ) );
  }

您也可以实现Iterator或者更深入兔子的洞并从ArrayObject继承

于 2013-11-12T19:15:02.877 回答
1

如果您正在寻找 Iterator 以外的解决方案(我个人会使用),您可以创建一个提供过滤器的 twig 扩展:

http://symfony.com/doc/current/cookbook/template/twig_extension.html

从这里您可以随心所欲地操纵对象。例如一个to_array过滤器,它接受各种类型的值并将它们(尽其能力)转换为数组,例如:

将 PHP 对象转换为关联数组

{% for key, val in myobject|to_array %}
    {{ key }}={{ val }}
{% endfor %}

然而,这只是为您提供您要求的解决方案,彼得的方法通常是更好的做法。

于 2013-11-12T20:31:07.333 回答