我需要具有基本信息的用户个人资料,如姓名,电子邮件,电话等.为此,我有一个实体用户.
我还需要存储调查问卷的答案.我想将它们作为文本字段中的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的第一次约会,所以任何帮助/小贴士都会欣赏.
事实证明它非常简单.我实际上并没有在这个特定问题上找到很多东西,所以如果你需要类似的东西,这里就是.
在具有此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添加到比赛中.