1

ネストされた 3 つのオブジェクト プロパティを持つオブジェクトをシリアル化しようとすると、

エラー: 最大関数ネスト レベル '250' に達しました

Entity Volunteer には、OneToOne with Person、OnetoMany with Focuses、および OneToMany with Skills があります。応答がシリアル化されている場合$volunteer->getPerson();、期待される json 応答が発生します。ただし、$volunteer->getFocuses();最大ネスティング レベル エラーも発生します。

アップデート

xdebug の最大値を増やすと、開発環境では 30 秒でタイムアウトします。

コントローラーのスニペット:

$em = $this->getDoctrine()->getManager();
$serializer = \JMS\Serializer\SerializerBuilder::create()->build();
$volunteer = $em->getRepository('HOTV2Bundle:Volunteer')->find($id);
$response = new JsonResponse($serializer->serialize($volunteer, 'json'));
4

3 に答える 3

2

最大ネスト レベルの問題は、必要以上にシリアル化しようとしていることを示しています。

JMS エンティティ構成 (注釈、xml、または yml) でシリアライズするフィールドを指定します。注釈を使用します。私は常にエンティティ/ドキュメントに @ ExclusionPolicy ("all") でアノテーションを付けることから始め、次に明示的に @ Exposeプロパティと関係を付けます。

@ Accessorおよび @ VirtualPropertyメソッドの注釈は、出力をカスタマイズするのに非常に役立ちます。関連するフォーカスをオブジェクトとしてシリアライズする代わりに、getFocusTitles@VirtualProperty でメソッドにアノテーションを付けて、タイトルの単純な配列をシリアライズすることができます。

もちろん、上記のように関連するエンティティに注釈を付ける必要があります。

于 2014-07-29T22:25:33.197 に答える
0

エンティティをシリアル化しようとする無限再帰があると仮定して、シリアル化できる次の配列を作成しました。この関数は Volunteer オブジェクトをパラメーターとして受け取ります。

public function createVolunteerArray($vol) {
    $p = $vol->getPerson();
    $person = array(
        'id' => $p->getId(),
        'firstName' => $p->getFirstName(),
        'lastName' => $p->getLastName(),
        'email' => $p->getEmail(),
        'address' => $p->getAddress(),
        'city' => $p->getCity(),
        'state' => $p->getState(),
        'zip' => $p->getZip(),
    );
    $f = $vol->getFocuses();
    $focusArray = array();
    foreach ($f as $foc) {
        $focus['id'] = $foc->getId();
        $focus['focus'] = $foc->getFocus();
        $focusArray[] = $focus;
    }
    $s = $vol->getSkills();
    $skillArray = array();
    foreach ($s as $sk) {
        $skill['id'] = $sk->getId();
        $skill['skill'] = $sk->getSkill();
        $skillArray[] = $skill;
    }
    $volunteer = array(
        'person' => $person,
        'focuses' => $focusArray,
        'skills' => $skillArray,
    );
    return $volunteer;
}
于 2013-12-31T19:59:28.687 に答える
0

これは xdebug エラー メッセージです。これは、自分自身を 250 回以上呼び出す再帰関数があることを意味します。

php.ini のネスト レベルを上げる必要があります。

xdebug.max_nesting_level = 1000

それ以外の場合は、スクリプトでネストレベルを設定できます

ini_set('xdebug.max_nesting_level', 1000)
于 2013-12-26T23:01:20.367 に答える