use*_*226 7 symfony-forms symfony doctrine-orm symfony-sonata sonata-admin
编辑:对于任何有兴趣解决相同问题的人来说,这就是诀窍:
echo `'xdebug.max_nesting_level = 250' >> /etc/php5/conf.d/xdebug.ini`
Run Code Online (Sandbox Code Playgroud)
我为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'
) );
Run Code Online (Sandbox Code Playgroud)
B实体嵌入C实体,具体如下:
$formMapper->add( 'c', 'sonata_type_model', array(
'required' => true,
'label' => ucfirst( $this->trans( 'c', array(), $this->translationDomain, $this->langCode ) )
), array( 'edit' => 'list' ) );
Run Code Online (Sandbox Code Playgroud)
注意:改变'edit' => 'list'有利于'edit' => 'standard'避免以下错误.
array( 'edit' => 'list' )在sonata_type_model表单类型上放置B Admin实体会在编辑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
Run Code Online (Sandbox Code Playgroud)
棘手或奇怪的是,无论编辑是列表还是标准,如果我去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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
为了能够看一下所有你可以使用sonata演示项目来检查类似的行为.
正如您所看到的那样,可以在Sonata项目演示中找到相同的用例,其中Gallery与GalleHasMedias链接,该GalleHasMedias链接到Media:http://demo.sonata-project.org/admin/sonata/media/gallery/255 / edit?context = default正如你所看到的,GalleryHasMedia与Gallery有一个ManyToOne关系,另一个与Media有关系,因此当你编辑一个Gallery时,你可以看到一个sonata_type_modelwith,edit' => 'inline','inline' => 'table',所以GalleryHasMedia嵌入在Gallery表格中,以便能够添加新的媒体将与当前图库链接并存储在其中GalleryHasMedia.
有没有人遇到暴露的情况?希望有人可以指出正确的方向或帮助了解正在发生的事情.
PD:对我来说,似乎B和C实体在无限循环中相互链接/嵌入.但正如所说,3个管理员分别工作得很好(而A没有嵌入B).
这是运行xdebug的服务器的常见问题.您必须通过增加xdebug.max_nesting_levelxdebug.ini配置来增加嵌套级别.将它设置为250就足够了.
添加设置的一种快速方法是在linux服务器上执行此操作:
echo `'xdebug.max_nesting_level = 250' >> /etc/php5/conf.d/xdebug.ini`
Run Code Online (Sandbox Code Playgroud)
对于任何有兴趣解决同一问题的人来说,这都成功了:
echo `'xdebug.max_nesting_level = 250' >> /etc/php5/conf.d/xdebug.ini`
Run Code Online (Sandbox Code Playgroud)