1

このチュートリアルに従って、すべてをまとめてプロジェクトで機能させると、ネストされたリストを表示するだけで (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; 

「テスト」文字列を出力することを期待していますが、これだけを出力します:

    object(RecursiveIteratorIterator)#414 (0) {}

しかし、ダンプの前に行うと:

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

タイトルを取得しました.\Doctrine\Common\Collections\ArrayCollection オブジェクトのループに何らかの形で失敗します。

4

2 に答える 2

1

Doctrine のものではなく別の Debug クラスを使用している場合、それが疑わしい可能性があります。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;
}

この問題を解決するには、次の 2 つの方法があります。 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 に答える