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:
- Set multiple to true in your choice form widget.
- Change mapping from array to string for $role property in your entity.
- 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.