我正在创建一个实体basketElement,它通过Sonata \ Form \ Type \ CollectionType实例化的admin链接到父实体篮子。在创建实体basketElement时,我还需要调用需要实体篮子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字段管理员如下:
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
可以添加到fieldDescriptionOptions
方法的add
方法的CollectionType
论证中。比在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()]
])
;
}
}
prePersist
和preUpdate
方法中的childAdmin