亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

symfony 3.4:形式:允許實體的孩子原型

symfony 3.4:形式:允許實體的孩子原型

PHP
MM們 2023-04-02 14:48:26
我的目標是創建一本書的章節,在每一章中,我可以擁有任意數量的章節作為子章節。我有一個實體,它是每一章的一本書的一章,我可以添加一個子章(實際上是另一章(但 id parent 不為空))class Chapter{           /**     * One champ has One parent champ.     * @ORM\ManyToOne(targetEntity="Chapter", inversedBy="children")     * @ORM\JoinColumn(name="id_parent", referencedColumnName="id")     */    public $parent;         /**     * One champ has Many champs.     * @ORM\OneToMany(targetEntity="Chapter", mappedBy="parent",cascade={"persist"}))     * @ORM\OrderBy({"ordre" = "ASC"})     */    public $children;   我想在每一章中使用 symfony 添加/刪除/修改,所以我有以下表單類型public function buildForm(FormBuilderInterface $builder, array $options){        $builder->add('libelleLong', textType::class, ['label'=> 'titre']);         $builder->add('children', CollectionType::class,[         'entry_type' => ChapterType::class,         'entry_options' => ['label' => false,'block_name' => 'childrenList'],             'block_name' => 'childrenList',         'label'=> false,         'allow_add'=>true,         'allow_delete'=> true,         'prototype'=> true,         'by_reference' => false,         ]     );             }但是這條線'prototype'=> true把一切都放下了......[2020 年 5 月 19 日 20:57:08 UTC] PHP 致命錯誤:供應商\symfony\symfony\src\Symfony\Component\Debug\Exception\OutOfMemoryException 中允許的 134217728 字節的內存大小已耗盡(試圖分配 32768 字節)。第 1 行的 php我怎樣才能讓孩子們使用原型?
查看完整描述

1 回答

?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

我相信,問題最終是遞歸的。因為子表單也將有一個children字段,所有子表單也將有children字段......無限。因此,它只是為了創建它而耗盡了內存。(這個問題只在添加時發生prototype,因為它必須渲染一個未來的孩子,它也有原型,并且必須做同樣的事情 - 請注意,表單組件不是處理遞歸的最佳裝備。也許你可以找到一個技術上和視覺上處理這個問題的不同方式,例如 (pos,string,depth) 元組的列表,通過表單渲染/js 進行光學改進,并進行轉換等)


所以你必須限制這個遞歸的深度。一種通用的方法(我不確定這是否有效)是添加一個選項max_depth,它基本上告訴表單生成器它是否可以以及還有多少級別。


為此,您的表單類型類應包含一個方法configureOptions:


public function configureOptions(OptionsResolver $resolver)

{

    $resolver->setRequired(['max_depth']);

    $resolver->setDefaults([

        'data_class' => Chapter::class, // you probably have this line!

        'max_depth' => 3, // default value

    ]);

}

這會將配置選項添加到您的表單類型,現在我們必須在您的buildForm方法中使用它:


public function buildForm(FormBuilderInterface $builder, array $options) {


    $builder->add('libelleLong', textType::class, ['label'=> 'titre']);


    // only add children sub form, if max_depth > 0, to stop infinite recursion

    if($options['max_depth'] > 0) { 

        $builder->add('children', CollectionType::class,[

             'entry_type' => ChapterType::class,

             'entry_options' => [

                   'label' => false,

                   'block_name' => 'childrenList',

                   // IMPORTANT!!! reduce max_depth by 1

                   'max_depth' => $options['max_depth'] - 1, 

             ],


             'block_name' => 'childrenList',

             'label'=> false,

             'allow_add' => true,

             'allow_delete'=> true,

             'prototype'=> true,

             'by_reference' => false,


         ]);

    } // end if for max_depth

}

我會建議保持max_depth小,比如...... 2 或 3。


另一種方法是,創建另一種名為 SubChapterType 和 SubSubChapterType 的表單類型,它們本質上與 ChapterType 相同,只是它們的 是children下entry_type一個表單類型,其中最后一個表單類型沒有字段 children。


查看完整回答
反對 回復 2023-04-02
  • 1 回答
  • 0 關注
  • 111 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號