1

按照本教程并将所有内容放在一起使其在我的项目中工作,只是为了显示一个嵌套列表(使用学说 2 和 zf2),我无法进入 foreach。使用这段代码:

    $root_categories        = $em->getRepository('Controleitor\Model\Entity\Category')->findBy(array('parent_category' => null));
    $collection             = new \Doctrine\Common\Collections\ArrayCollection($root_categories);
    $category_iterator  = new \MYMODULE\Model\Entity\RecursiveCategoryIterator($collection);
    $recursive_iterator     = new \RecursiveIteratorIterator( $category_iterator, \RecursiveIteratorIterator::SELF_FIRST);

    foreach ($recursive_iterator as $index => $child_category){
        echo 'test';         
    }
    Debug::dump($recursive_iterator);die; 

我期待打印“测试”字符串,但它只打印:

    object(RecursiveIteratorIterator)#414 (0) {}

但是当我在转储之前这样做时:

    $recursive_iterator->current()->getTitle();

我得到了标题.. 它以某种方式循环 \Doctrine\Common\Collections\ArrayCollection 对象失败。

4

2 回答 2

1

如果您使用不同的 Debug 类而不是 Doctrine 的类,那可能是嫌疑犯。试试 Doctrine\Common\Util\Debug::dump()。

解释来自官方文档

延迟加载代理总是包含 Doctrine 的 EntityManager 及其所有依赖项的实例。因此 var_dump() 可能会转储一个无法渲染和读取的非常大的递归结构。您必须使用 Doctrine\Common\Util\Debug::dump() 将转储限制为人类可读的级别。此外,您应该知道将 EntityManager 转储到浏览器可能需要几分钟,并且 Debug::dump() 方法只是忽略它在 Proxy 实例中出现的任何情况。

于 2013-09-11T15:52:36.543 回答
0

我遇到过同样的问题。我已经和本教程的作者讨论过,他建议我检查 RecursiveCategoryIterator 类的 valid() 函数,并且有问题。由于我使用的是“use”语句并在类名之前留下了一个反斜杠:

use Entity\Category;    
use Doctrine\Common\Collections\Collection;

class RecursiveCategoryIterator implements \RecursiveIterator
{
//.......
public function valid()
{
    return $this->posts->current() instanceof \Category;
}

有两种方法可以解决这个问题: 1. 删除反斜杠:

    return $this->posts->current() instanceof Category;

2. 使用完整的命名空间:

use Entity\Category; // remove this line
//.......
    return $this->posts->current() instanceof \Entity\Category;

希望有帮助。

于 2014-05-27T11:59:32.603 回答