如何在Symfony EasyAdmin中的自定义表单类型中获取实体

4

我正在尝试按照文档描述向 JSONB 字段添加自定义类型:

表单: 字段: - { 属性:'attr',类型:'App\Form\Type\AttrType'}

类的实现:

class AttrType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {

            $builder
                ->add('title',TextType::class, array('label' => 'title'));
        }


    }

它能够正常工作。

但是我有一个JSONB列,我不知道存储了多少字段和它们的类型。

问题:如何在buildForm中获取实体来访问attr。所需数据存在于$builder$options中,我可以在var_dump()中看到。

简化后的期望结果:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    foreach($builder->getData()->getAttr() as $key=>$value){
    $builder->add($key,TextType::class, array('data' => $value));
    }
}

$data = $options['data'] ?还是我没理解对… - Andrelec1
1个回答

0

我自己也一直在寻找解决方案,等待已久,我们并不孤单。看起来EasyCorp/EasyAdminBundle已经放弃了这个问题。

虽然这可能不是你想要的答案,但到目前为止,我唯一找到的解决方案是在你的自定义表单类型中读取请求;就像在控制器中一样。这需要数据以某种方式出现在请求URI中,否则它将无法工作

示例URI:/path/to/action/[ID]或/path/to/action/99,其中“99”是您要查找的实体的ID。

use App\Repository\SomeRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;

class AttrType extends AbstractType
{
    private ?Request $request = null;
    private SomeRepository $repository;

    public function __construct(RequestStack $requestStack, SomeRepository $repository)
    {
        $this->repository = $repository;
        if ($req = $requestStack->getCurrentRequest()) {
            $this->request = $req;
        }
    }

    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        if ($this->request && $id = (int) $this->request->get('id')) {
            $parentFormData = $this->repository->find($id);
        }
    }
}

当然,这需要对相同数据进行第二次查找,因此远非优雅,但在某些情况下对我起作用,并使我保持了父表单类型的整洁。

希望它有所帮助。


编辑:

你也可以在 buildView()中获取父表单数据,但通常对我来说这从未足够,因此以上解决方案。 对于任何不知道的人,在这里

use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;

class AttrType extends AbstractType
{
    public function buildView(FormView $view, FormInterface $form, array $options): void
    {
        $parentData = $form->getParent()->getData();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接