Symfony2 表单集合数组错误

Symfony2 form collection array error

我已经构建了带有角色的用户实体,其中包含用于在数据库中存储角色的字段:

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

    public function getRoles()
    {
        $roles = $this->roles;
        $roles[] = 'ROLE_USER';

        return array_unique($roles);
    }

    public function setPassword($password)
    {
        $this->password = $password;

        return $this;
    }

它像数组一样存储在数据库中。这是建立在教程之上的。我意识到如果它像数据库中的一个数组,那么它需要是表单生成器中的一个集合,对吗?这是代码:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('username')
        ->add('password')
        ->add('plainPassword', 'repeated', array('type' => 'password', 'required' => false))
        ->add('roles', 'choice', array(
           'choices' => array(
               'ROLE_USER'   => 'ROLE_USER',
               'ROLE_ADMIN' => 'ROLE_ADMIN'
           ),
           'multiple' => true,
       ))
        ->add('isActive')
        ->add('mail');
}

结束树枝渲染

 {{ form_widget(edit_form.roles) }}

所以基本的想法是有一个 select 字段,其中包含用户 select 的所有角色,然后更新数据库。但出于某种原因,当我删除

'multiple' => true

我遇到这样的错误...

最好的解决方法是什么?我不想有多项选择,而只有一个。

最后一件事是它没有填充数据库,但我得到了信息,当我在坚持之前调用时,它保存了它们,但不是默认情况下。

 $entity->setRoles($entity->getRoles());

你必须转变你的价值观。

您可以构建一个小部件

    <?php

namespace Atix\UserBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Atix\UserBundle\Form\DataTransformer\RolesFormDataTransformer;

class RolesFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $transformer = new RolesFormDataTransformer();
        $builder->add('roles', 'choice', array(
            'choices'   => array(
                            'ROLE_P1'        => 'Role p1',
                            'ROLE_RESPONSABLE'   => 'Role responsable',
                            'ROLE_ADMIN'             => 'Role admin',
                            ),
            'label' => false,
            'required'  => false
        ))->addModelTransformer($transformer);

    }
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        // $resolver->setDefaults(array(
        //     'data_class' => '',
        // ));
    }

    public function getName()
    {
        return 'roles_widget';
    }
}

还有你的数据转换器

<?php

namespace Atix\UserBundle\Form\DataTransformer;

use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;

class RolesFormDataTransformer implements DataTransformerInterface
{
    /**
     * Transforms an array to a string.
     * POSSIBLE LOSS OF DATA
     *
     * @return string
     */
    public function transform($array)
    {
        if (empty($array)) {
            return $array;
        }

        $newArray = array();
        $newArray["roles"] = $array;

        return $newArray;
    }

    /**
     * Transforms a string to an array.
     *
     * @param  string $string
     *
     * @return array
     */
    public function reverseTransform($array)
    {

        //var_dump($string);
        $aRoles = array();
        foreach($array as $allValue)
        {
            foreach($allValue as $value)
            {
                $aRoles[] = $value;
            }
        }
        return $aRoles;
    }
}

您在服务中声明表格

user.form.type.roles:
    class: Atix\UserBundle\Form\Type\RolesFormType
    tags:
        - { name: form.type, alias: roles_widget }

您现在可以像这样调用您的小部件

$builder->add('roles', 'roles_widget');