Symfony2 - array to string conversion error Symfony2 - array to string conversion error symfony symfony

Symfony2 - array to string conversion error


Symfony's trying to convert your $role(array property) to not multiple choice field(string).

There's several ways to deal with this problem:

  1. Set multiple to true in your choice form widget.
  2. Change mapping from array to string for $role property in your entity.
  3. If you insist to have above options unchanged, you can create DataTransformer. That's not the best solution because you will lose data if your array have more than 1 element.

Example:

<?phpnamespace Acme\DemoBundle\Form\DataTransformer;use Symfony\Component\Form\DataTransformerInterface;use Symfony\Component\Form\Exception\TransformationFailedException;class StringToArrayTransformer implements DataTransformerInterface{    /**     * Transforms an array to a string.      * POSSIBLE LOSS OF DATA     *     * @return string     */    public function transform($array)    {        return $array[0];    }    /**     * Transforms a string to an array.     *     * @param  string $string     *     * @return array     */    public function reverseTransform($string)    {        return array($string);    }}

And then in your form class:

use Acme\DemoBundle\Form\DataTransformer\StringToArrayTransformer;/* ... */$transformer = new StringToArrayTransformer();$builder->add($builder->create('role', 'choice', array(                'label' => 'I am:',                'mapped' => true,                'expanded' => true,                'multiple' => false,                'choices' => array(                    'ROLE_NORMAL' => 'Standard',                    'ROLE_VIP' => 'VIP',                )              ))->addModelTransformer($transformer));

You can read more about DataTransformers here: http://symfony.com/doc/current/cookbook/form/data_transformers.html


Make sure that you use proper data type in ORM file. In this case, your role field cannot be string. It must be a many-to-many relation, array or json_array.

If you choose one of them, symfony will insert the data without effort or any type of transformer.

E.g.:

// Resources/config/User.orm.ymlfields:  role:      type: array      nullable: false

So, it will live in your database as like:

a:2:{i:0;s:4:"user";i:1;s:5:"admin";}


I just add a DataTransformer without changing the array type of my roles attribute then I put this in my UserType :

use AppBundle\Form\DataTransformer\StringToArrayTransformer;//...$transformer = new StringToArrayTransformer();    $builder->get('roles')->addModelTransformer($transformer);

And it works for me.