在 CollectionType Admin 中获取父实体 ID

Posted

技术标签:

【中文标题】在 CollectionType Admin 中获取父实体 ID【英文标题】:Get parent entity id in CollectionType Admin 【发布时间】:2019-08-01 11:57:48 【问题描述】:

我正在创建一个实体 basketElement,它通过 Sonata\Form\Type\CollectionType 实例化管理员链接到父实体 basket。在创建实体 basketElement 时,我还需要调用需要实体 basket 的 id 的服务函数。

现在,我有一个管理员:

class BasketAdmin extends AbstractAdmin 
    /**
     * @param \Sonata\AdminBundle\Form\FormMapper $formMapper
     */
    public function configureFormFields(FormMapper $formMapper): void
    
        $formMapper->with('basket.group.basketElements')
            ->add('basketElements', Sonata\Form\Type\CollectionType::class)
        ;
    

basketElements 字段 admin 如下:

class BasketElementAdmin extends AbstractAdmin 
    /**
     * @param \Sonata\AdminBundle\Form\FormMapper $formMapper
     */
    public function configureFormFields(FormMapper $formMapper): void
    
        $formMapper->with('basketElement.group.products')
            ->add('basket', Sonata\AdminBundle\Form\Type\ModelHiddenType::class)
        ;
    

    public function prePersist()
        $this->myService->myFunction($this->getParent()->getSubject()->getId());
    

如何访问父实体?

【问题讨论】:

id 是自动生成的并且在实体类中没有设置方法吗? 它是自动生成的。我可以使用父母的 getSubject 但我猜有一个错误,与github.com/sonata-project/SonataAdminBundle/issues/3747 如果它是自动生成的,那么它没有 setter 方法。然后它在形式上什么也没有丢失。你到底想达到什么目的? 在创建basketElement 时,我还需要调用需要父basket 实体的服务。如果我理解正确,这应该在basketElementAdmin 中使用getParent 来完成,但getParent 总是返回null。在我看来,BasketAdminBasketElementAdmin 之间没有联系。加载BasketElementAdmin 的url 仅包含uniqidpuniqidpuniqid 未在php 代码中使用。 这是经典的XY problem。请将该信息添加到您的问题中,解释您实际想要实现的目标,添加所有其他相关代码,例如服务。最终你的问题可以用另一种方法来解决,也许使用prePersist lifecycleCallback 【参考方案1】:

我找到了 2 个解决方案;

link_parameters 可以添加到 CollectionType 字段的 add 方法的 fieldDescriptionOptions 参数中。比在 basketElementAdmin 中可以从请求对象中检索链接参数并使用它来检索链接实体。
    /**
     * @param \Sonata\AdminBundle\Form\FormMapper $formMapper
     */
    public function configureFormFields(FormMapper $formMapper): void
        
            $formMapper->with('basket.group.basketElements')
                ->add('basketElements', Sonata\Form\Type\CollectionType::class, [], [
                    'link_parameters' => ['basket_id' => $this->getSubject()->getId()]
                ])
            ;
        
    
可以在父admin的prePersistpreUpdate方法中调用需要父id的service函数并设置为childAdmin

【讨论】:

以上是关于在 CollectionType Admin 中获取父实体 ID的主要内容,如果未能解决你的问题,请参考以下文章

Symfony:CollectionType 中的 OrderBy

Symfony 4.4如何使用collectionType从0个字段开始

Symfony CollectionType:合并新条目

Symfony5 handleRequest 更新原始 collectionType 对象

symfony 3.4.14 collectionType编辑和删除问题

Symfony 4 表单 CollectionType:仅使新行需要 FileType 元素