在将表单分配到Symfony2中的实体之前插入代码

时间:2013-06-25 08:16:41

标签: symfony entity roles

假设在我的系统中有一些用户角色:ROLE_ADMIN,ROLE_MODERATOR,ROLE_CUSTOMER_PERSON,ROLE_CUSOMER_COMPANY

在注册表格中,我想让用户选择他想要的角色(在ROLE_CUSTOMER_PERSON和ROLE_CUSOMER_COMPANY之间)。

所以我在表单类中添加了choice类型字段,值为1和2.我可以添加一个约束来检查恶意用户是否没有选择任何其他用户,这没关系。但是现在我必须以某种方式将这些1和2转换为ROLE_CUSTOMER_PERSON和ROLE_CUSOMER_COMPANY,并使用addRole方法分配它们,否则isValid表单函数将在$ roles数组属性上失败。

那么有没有一种方法可以让我在第一次验证(如果它是1或2)之后“翻译”事物并自动生成表单的isValid方法?

我知道我可以使用Request对象,手动验证然后在实体中设置它然后验证表单的其余部分但是它只是讨厌而且每次我想要使用它时我都必须这样做形式。

有什么想法吗? 感谢。

3 个答案:

答案 0 :(得分:0)

也许你应该添加一个自定义表单类型,像RoleType一样的smtg?

您可以在documentation here

中查看如何执行此操作

答案 1 :(得分:0)

你不能直接在选择字段中传递值吗?

$builder->add('role', 'choice', ['choices' => [ 'ROLE_CUSTOMER_PERSON' ] ]);

当表单绑定时,它将在数据对象上调用此方法:

$user->setRole('ROLE_CUSTOMER_PERSON'); // or addRole

您还可以想象addRole方法足够聪明,可以将1和2值转换为正确的字符串。

答案 2 :(得分:0)

您正在寻找DataTransformer

否则,当发生symfony的listener/subscriber之一时,您可以使用form events转换表单数据。