首页 > 解决方案 > 在 CollectionType Admin 中获取父实体 ID

问题描述

我正在创建一个实体basketElement ,它通过 Sonata\Form\Type\CollectionType 实例化管理员链接到父实体篮。在创建实体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)
        ;
    }
}

篮子元素字段管理员如下:

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());
    }
}

如何访问父实体?

标签: symfonysymfony4sonata-adminsonata

解决方案


我找到了 2 个解决方案;

  • link_parameters可以添加到字段上的方法的fieldDescriptionOptions参数中。比在 basketElementAdmin 中可以从请求对象中检索链接参数并使用它来检索链接实体。addCollectionType
    /**
     * @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()]
                ])
            ;
        }
    }
  • 需要父id的服务功能可以在父admin的prePersistand方法中调用并设置给childAdminpreUpdate

推荐阅读