Sonata: Неустранимая ошибка: достигнут максимальный уровень вложенности функций '100'.. при встраивании форм

РЕДАКТИРОВАТЬ: Для всех, кто заинтересован в решении той же проблемы, это помогло:

echo `'xdebug.max_nesting_level = 250' >> /etc/php5/conf.d/xdebug.ini` 

Я создал 3 администратора для 3 объектов, связанных друг с другом, где администратор B внедряет администратора B, а администратор B внедряет администратора C. Сущность B имеет отношение ManyToOne с сущностью A и B.

Сущность B встраивает сущность B со следующим кодом:

$formMapper->add('b', 'sonata_type_collection', array(
    'by_reference' => false
), array(
    'edit' => 'inline',
    'inline' => 'table',
    'sortable'  => 'position'
) );

Сущность B встраивает сущность C со следующим кодом:

 $formMapper->add( 'c', 'sonata_type_model', array( 
    'required'  => true, 
    'label'     => ucfirst( $this->trans( 'c', array(), $this->translationDomain, $this->langCode ) )
    ), array( 'edit' => 'list' ) );

Примечание: изменение 'edit' => 'list'в пользу 'edit' => 'standard'позволяет избежать следующей ошибки.

Размещение array( 'edit' => 'list' )в объекте B Admin в типе формы sonata_type_modelприводит к следующей ошибке при редактировании объекта A. Если вместо этого используется array( 'edit' => 'standard' ), то ошибка не выводится:

Sonata: Fatal error: Maximum function nesting level of '100' reached, aborting! in myProject/vendor/doctrine-common/lib/Doctrine/Common/Lexer.php on line 756  

Хитрость или любопытство заключается в том, что независимо от того, является ли редактирование списком или стандартным, если я перехожу к B админ для редактирования. проблема появляется только в том случае, если я редактирую B, встроенный в A, с установленным параметром списка редактирования. И это происходит со мной в некоторых других объектах, где я реализовал такое же поведение.

Вот сущности A, B и C и то, как они связаны друг с другом:

Сущность A:

class A
{
    /**
     *  @ORM\Id
     *  @ORM\Column(type="integer", length=4)
     *  @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;
    /** @ORM\OneToMany(targetEntity="B", mappedBy="a", cascade={"persist"}, orphanRemoval=true ) */
    protected $b;
}

Сущность B:

class B
{
    /**
     *  @ORM\Id
     *  @ORM\Column(type="integer", length=4)
     *  @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id
    /**
     *  @ORM\ManyToOne(targetEntity="C", inversedBy="b", cascade={"persist"} )
     *  @ORM\JoinColumn(name="c_id", nullable=false, referencedColumnName="id", onDelete="CASCADE")
     */
    private $c;
    /**
     *  @ORM\ManyToOne(targetEntity="A", inversedBy="b", cascade={"persist"} )
     *  @ORM\JoinColumn(name="a_id", nullable=false, referencedColumnName="id", onDelete="CASCADE")
     */
    private $a;
}

Сущность C:

Class C
{
    /**
     *  @ORM\Id
     *  @ORM\Column(type="integer", length=4)
     *  @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;
    /** @ORM\OneToMany(targetEntity="B", mappedBy="c", cascade={"persist"} ) */
    private $b;
}

Чтобы иметь возможность взглянуть на все это, вы можно использовать демонстрационный проект сонаты, чтобы проверить подобное поведение.
Как вы можете видеть, это тот же вариант использования, который можно найти в демо-версии Sonata Project, где Галерея связана с GalleHasMedias, которая ссылается на Медиа: http://demo.sonata-project.org/admin/sonata/media/ Gallery/255/edit?context=defaultКак видите, у GalleryHasMedia есть связь ManyToOne с галереей и еще одна связь с медиа, так что когда вы редактируете галерею, вы можете увидеть sonata_type_modelс edit' => 'inline','inline' => 'table',поэтому GalleryHasMedia встроена в форму галереи, чтобы иметь возможность добавлять новые медиафайлы, которые будут связаны с текущей галереей и сохранены внутри ГалереяHasMedia.

Сталкивался ли кто-нибудь с ситуацией, подобной разоблаченной? Надеюсь, кто-то может указать в правильном направлении или помочь понять, что происходит.

PD: Мне кажется, что объекты B и C связываются/встраиваются друг в друга в бесконечном цикле. Но, как сказано, 3 админа отлично работают по отдельности (пока А не встраивает Б).

7
задан Benjamin 27 September 2012 в 02:24
поделиться