Symfony2在绑定时丢失表单数据

时间:2014-08-25 13:01:46

标签: php forms symfony

我遇到了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的信息,反对使用此名称或什么。

无论如何,我真的很好奇为什么会出现这个问题,所以如果有人能够启发我会很好:)。谢谢。

1 个答案:

答案 0 :(得分:0)

正如Cerad所说,因为实体扩展了FOSUserBundle:User,这意味着它将始终具有角色user,它从表单中过滤掉了ROLE_USER。谢谢您的回答。最后,我正在研究这个问题的同事采用了另一种方法,但我仍然很好奇:)