我遇到了Symfony2表单的一个问题,我无法弄清楚,即表单上有5个用户角色的复选框。它们在实体中定义为常量并添加到表单类型中,如下所示:
public static $GENERAL_ROLES = array(
"ROLE_ADMIN" => "ROLE_ADMIN",
"ROLE_USER" => "ROLE_USER",
"ROLE_WORKER" => "ROLE_WORKER",
"ROLE_PM" => "ROLE_PM",
"ROLE_PM_MANAGER" => "ROLE_PM_MANAGER"
);
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('username', null, array('required' => true, 'label' => "Login"))
->add('expiresAt', 'date', array(
'label' => "End account date"
'required' => false,
'widget' => 'single_text',
'format' => 'dd-MM-yyyy',
))
->add('plainPassword', 'repeated', array(
'type' => 'password',
'options' => array('translation_domain' => 'FOSUserBundle'),
'first_options' => array('label' => 'Mot de passe'),
'second_options' => array('label' => 'Confirmation'),
'invalid_message' => 'fos_user.password.mismatch',
))
->add('roles', 'choice', array(
'label' => 'Role',
'mapped' => true,
'expanded' => true,
'multiple' => true,
'attr' => array('class' => 'control-label'),
'choices' => \FullSix\ProjectForecastBundle\Entity\Login::$GENERAL_ROLES
))
;
}
到目前为止,选择出现在表格上。当我提交所有角色时,如果我检查$ _POST,那么所有角色都在那里,一切都很好。但是,当我执行$ form-> bind($ request)时,事情开始向南。 在验证器中,
class LoginValidator extends ConstraintValidator
{
public function validate($login, Constraint $constraint)
{
if ($login->getPlainPassword() || $login->getUsername() || $login->getRoles() || $login->getExpiresAt()) {
if (!$login->getPlainPassword()) {
$this->context->addViolation($constraint->noPasswordMessage);
}
if (!$login->getUsername()) {
$this->context->addViolation($constraint->noUsernameMessage);
}
if (!$login->getRoles()) {
$this->context->addViolation($constraint->noRole);
}
}
}
}
5个角色中只有4个仍然在这里,特别是除了ROLE_USER之外的所有角色。有趣的是,如果我将ROLE_USER中的值更改为其他任何内容,它就可以正常工作。它只会打破这个特定的价值。
我找不到任何有关天气symfony的信息,反对使用此名称或什么。
无论如何,我真的很好奇为什么会出现这个问题,所以如果有人能够启发我会很好:)。谢谢。
答案 0 :(得分:0)
正如Cerad所说,因为实体扩展了FOSUserBundle:User,这意味着它将始终具有角色user,它从表单中过滤掉了ROLE_USER。谢谢您的回答。最后,我正在研究这个问题的同事采用了另一种方法,但我仍然很好奇:)