在 CollectionType Admin 中获取父实体 ID

Get parent entity id in CollectionType Admin

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

的服务函数

现在,我有一个管理员:

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

如何访问父实体?

我找到了 2 个解决方案;

  • link_parameters 可以添加到 CollectionType 字段上 add 方法的 fieldDescriptionOptions 参数。在 basketElementAdmin 中,可以从请求对象中检索 link 参数并使用它来检索 linked 实体。
    /**
     * @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()]
                ])
            ;
        }
    }
  • 需要parent id的service函数可以在parent admin的prePersistpreUpdate方法中调用设置给childAdmin