編集:同じ問題を解決することに興味がある人にとっては、それはトリックでした:
echo `'xdebug.max_nesting_level = 250' >> /etc/php5/conf.d/xdebug.ini`
相互にリンクされた 3 つのエンティティに対して 3 つの管理者を作成しました。A 管理者は B 管理者を埋め込み、B 管理者は C 管理者を埋め込みます。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 管理エンティティをフォーム タイプに配置すると、A エンティティsonata_type_model
の編集中に次のエラーが発生します。代わり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 デモ プロジェクトを使用して同様の動作を確認してください。
ご覧のとおり、Gallery が Media に対してリンクしている GalleHasMedias に対してリンクされている Sonata Project のデモで見られるのと同じユース ケースです: http://demo.sonata-project.org/admin/sonata/media/gallery/255 /edit?context=defaultご覧のとおり、GalleryHasMedia は Gallery との ManyToOne 関係と、Media との別の関係を持っているため、Gallery を編集するsonata_type_model
とedit' => 'inline','inline' => 'table',
、GalleryHasMedia が Gallery フォーム内に埋め込まれ、新しいものを追加できるようになります。現在のギャラリーにリンクされ、内部に保存されるメディアGalleryHasMedia
。
暴露されたような状況に直面した人はいますか? 誰かが正しい方向を指し示すか、何が起こっているのかの手がかりを得るのを手伝ってくれることを願っています.
PD: 私には、B エンティティと C エンティティが無限ループで互いにリンク/埋め込みしているように見えます。しかし、前述のように、3 人の管理者が別々にうまく機能しています (A は B を埋め込んでいません)。