奏鸣曲:致命错误:嵌入表格时达到了'100'的最大函数嵌套级别

时间:2012-06-20 13:22:22

标签: symfony doctrine-orm symfony-forms symfony-sonata sonata-admin

编辑:对于任何有兴趣解决同一问题的人来说,这就是诀窍:

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

我为3个相互链接的实体创建了3个管理员,其中A Admin嵌入了B Admin,B Admin嵌入了C Admin。 B实体与A和B实体具有ManyToOne关系。

实体使用以下代码嵌入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管理实体上放置sonata_type_model会在编辑A enity时出现以下错误。如果使用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管理员编辑它。如果我编辑嵌入到A中的B并使用编辑列表选项集,则只会出现此问题。在我实现相同行为的其他一些实体中发生了这种情况。

以下是A,B和C实体以及它们如何相互关联:

实体:

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演示项目来检查类似的行为 正如您所看到的那样,可以在Sonata项目演示中找到相同的用例,其中Gallery与GalleHasMedias链接,链接反对媒体:http://demo.sonata-project.org/admin/sonata/media/gallery/255/edit?context=default如您所见,GalleryHasMedia与Gallery有一个ManyToOne关系,另一个与媒体,因此当您编辑图库时,您可以看到带有sonata_type_model的{​​{1}},以便在Gallery表单中嵌入GalleryHasMedia,以便能够添加将与当前图库链接的新媒体和存储在edit' => 'inline','inline' => 'table',内。

有没有人遇到暴露的情况?希望有人可以指出正确的方向或帮助了解正在发生的事情。

PD:对我而言,似乎B和C实体在无限循环中相互链接/嵌入。但正如所说,3个管理员分别工作得很好(而A不嵌入B)。

2 个答案:

答案 0 :(得分:5)

这是运行xdebug的服务器的常见问题。您必须通过增加xdebug.ini配置中的xdebug.max_nesting_level来增加嵌套级别。将它设置为250就足够了。

添加设置的一种快捷方法是在linux服务器上执行此操作:

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

答案 1 :(得分:0)

对于任何有兴趣解决同一问题的人来说,这就是诀窍:

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