php – 表单构建器中的关联数组字段 – Symfony3

前端之家收集整理的这篇文章主要介绍了php – 表单构建器中的关联数组字段 – Symfony3前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
让我们从背景开始.

我需要具有基本信息的用户个人资料,如姓名,电子邮件,电话等.为此,我有一个实体用户.

我还需要存储调查问卷的答案.我想将它们作为文本字段中的json存储在数据库中.这些问题将来可能会发生变化,目前有大约30个问题,所以我不想将其存储为实体.所以目前在我的用户实体中我有这个:

/**
 * @var array
 *
 * @ORM\Column(name="questionnaire",type="json_array",nullable=true)
 */
private $questionnaire;

我知道Symfony会处理json_encode / json_decode的事情.所以这很棒.

但是现在,我在使用symfony构建器创建表单时遇到了一些问题.

首先,我想我可以尝试这样的事情:

$builder->add('questionnaire[source]');

哪个不起作用.对于symfony大师来说,显然我知道; o)

所以我目前的选择是:CollectionType或Data Transformers.

从我看到的,CollectionType将无法工作,因为它只适用于数字数组,其中我们有一些JS“添加另一行”或其他东西. http://symfony.com/doc/current/reference/forms/types/collection.html#adding-and-removing-items但如果我对此错了,我应该选择CollectionType,有一些神奇的方法请告诉我.我找不到这个.

所以我在考虑使用Data Transformers或者只是在没有这个Transformer的情况下在提交时创建一个数组.使用“mapped => false”创建问卷调查中的所有字段,然后将这些提交的值设置为$questionnaire的关联数组.这“感觉”还不错,但我不确定如何在“编辑”表单中处理这个问题(从我用0700这个文档来看).

调查问卷本身将有许多ChoiceType字段,CollectionType与“添加更多行”等等,它将有很多问题.所以它会有点复杂.我想避免为每个问题作为一个属性创建实体(不确定它是否是一个正确的选择,但考虑到我相信它是最好的一切).

这是我与symfony的第一次约会,所以任何帮助/小贴士都会欣赏.

几天后,我找到了自己问题的答案.赏金并没有帮助它更快,但嘿,有一个解决方案! ; O)

事实证明它非常简单.我实际上并没有在这个特定问题上找到很多东西,所以如果你需要类似的东西,这里就是.

在具有此json_array的实体类中,定义所有需要的键,如下所示:

/**
 * @var array
 *
 * @ORM\Column(name="questionnaire",nullable=true)
 */
private $questionnaire = [
    'favPet'=>'','favFood'=>'','favColor'=>''
];

接下来,在表单构建器中使用“property_path”!就这么简单… https://symfony.com/doc/current/reference/forms/types/form.html#property-path像这样:

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder,array $options)
{
    $builder
        ->add('name')
        ->add('email',EmailType::class)
        ->add('phone')
        ->add('address')
         ->add('favPet',TextType::class,[
            'label'=>'Fav pet','property_path'=>'questionnaire[favPet]'
        ])
        ->add('favFood',[
            'label'=>'Fav food','property_path'=>'questionnaire[favFood]'
        ])
        ->add('favColor',[
            'label'=>'Fav color','property_path'=>'questionnaire[favColor]'
        ])
    ;
}

而symfony将处理剩下的事情.因为我们使用json_array作为类型,symfony将处理json_encode / json_decode事物.为了让symfony在编辑模式下映射/填充值,属性必须定义它的键.否则你会收到错误

PropertyAccessor requires a graph of objects or arrays to operate on,but it found type “NULL” while trying to traverse path

然后在twig模板中你可以这样做:

{{ user.questionnaire.favPet }}

就是这样! :O))

至于JSON或实体.我知道我没有写任何实体,但我没有下定决心.经过一些IRC对话,阅读和https://stackoverflow.com/a/4013207/531099我可能会选择EAV.因此,如果您在JSON与实体之间做出决定,请将EAV添加到比赛中.

猜你在找的PHP相关文章