使用doctrine2和zf2显示嵌套列表

时间:2013-09-11 14:25:01

标签: recursion doctrine-orm zend-framework2

遵循这个tutorial并将所有内容放在一起以使其在我的项目中工作,只是为了显示嵌套列表(使用doctrine 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; 

我希望打印'test'字符串,但它只打印出来:

    object(RecursiveIteratorIterator)#414 (0) {}

但是当我在转储之前做的时候:

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

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

2 个答案:

答案 0 :(得分:1)

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

解释来自official documentation

  

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

答案 1 :(得分:0)

我有同样的问题。我已经与本教程的作者讨论过,他建议我检查RecursiveCategoryIterator类的valid()函数,并且存在问题。 因为我使用“使用”语句并在类名前留下反斜杠:

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;

希望有所帮助。