【问题标题】:Sonata: Fatal error: Maximum function nesting level of '100' reached.. when embedding forms奏鸣曲:致命错误:达到“100”的最大函数嵌套级别..嵌入表单时
【发布时间】:2012-06-20 13:22:21
【问题描述】:

编辑:对于有兴趣解决相同问题的任何人,都可以解决问题:

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

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

A实体嵌入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' 可避免以下错误。

sonata_type_model 表单类型的 B Admin 实体上放置 array( 'edit' => 'list' ) 在编辑 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 admin 编辑它。仅当我使用编辑列表选项集编辑嵌入到 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 Project 演示中的用例相同,其中 Gallery 与 GalleHasMedias 相关联,后者与 Media 相关联:http://demo.sonata-project.org/admin/sonata/media/gallery/255/edit?context=default 正如您所看到的,GalleryHasMedia 与 Gallery 有一个多对一关系,而另一个与 Media 有一个关系,所以当您编辑图库时,您可以看到 sonata_type_modeledit' => 'inline','inline' => 'table',,因此 GalleryHasMedia 嵌入到图库表单中,以便能够添加将与当前图库链接并存储在 GalleryHasMedia 中的新媒体。

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

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

【问题讨论】:

  • 成功了:echo 'xdebug.max_nesting_level = 250' >> /etc/php5/conf.d/xdebug.ini
  • 谢谢,在运行 phpunits 时使用 Symphony 让我疯狂了一天
  • 请提供实际答案,而不是使用您的解决方案编辑您的问题,以便社区知道该问题已解决。

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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢 lifo 的回答,但您应该已经注意到它已经通过编辑解决了。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 2017-06-27
    • 2013-07-03
    • 1970-01-01
    • 2014-12-01
    • 2011-07-03
    相关资源
    最近更新 更多