Erreur de conversion Symfony2 - array en string

j'ai lu les autres sujets, mais ça ne résout pas mon problème donc:

j'ai un

->add('role', 'choice', array(
                'label' => 'I am:',
                'mapped' => true,
                'expanded' => true,
                'multiple' => false,
                'choices' => array(
                    'ROLE_NORMAL' => 'Standard',
                    'ROLE_VIP' => 'VIP',
                ) 
            ))

Et ce que je fais, j'obtiens cette erreur:

Notice: Array to string conversion in C:xampphtdocsxxxvendorsymfonysymfony  srcSymfonyComponentFormExtensionCoreChoiceListChoiceList.php line 458 

dans ma forme Dactylographiez la méthode setRole n'est même pas appelée (quand je la renomme à quelques ordures l'erreur se produit encore). Pourquoi est-ce arrivé?

// EDIT

full stack trace:

in C:xampphtdocsxxxvendorsymfonysymfonysrcSymfonyComponentFormExtensionCoreChoiceListChoiceList.php at line 458  -

     */
    protected function fixIndex($index)
    {
        if (is_bool($index) || (string) (int) $index === (string) $index) {
            return (int) $index;
        }

    at ErrorHandler ->handle ('8', 'Array to string conversion', 'C:xampphtdocs     xxxvendorsymfonysymfonysrcSymfonyComponentFormExtensionCoreChoiceListChoiceList.php', '458', array('index' => array()))
in C:xampphtdocsxxxvendorsymfonysymfonysrcSymfonyComponentFormExtensionCoreChoiceListChoiceList.php at line 458  +
at ChoiceList ->fixIndex (array())
in C:xampphtdocsxxxvendorsymfonysymfonysrcSymfonyComponentFormExtensionCoreChoiceListChoiceList.php at line 476  +
at ChoiceList ->fixIndices (array(array()))
in C:xampphtdocsxxxvendorsymfonysymfonysrcSymfonyComponentFormExtensionCoreChoiceListSimpleChoiceList.php at line 152  +
at SimpleChoiceList ->fixChoices (array(array()))
in C:xampphtdocsxxxvendorsymfonysymfonysrcSymfonyComponentFormExtensionCoreChoiceListChoiceList.php at line 204  +
at ChoiceList ->getIndicesForChoices (array(array()))
in C:xampphtdocsxxxvendorsymfonysymfonysrcSymfonyComponentFormExtensionCoreDataTransformerChoiceToBooleanArrayTransformer.php at line 63  +
at ChoiceToBooleanArrayTransformer ->transform (array())
in C:xampphtdocsxxxvendorsymfonysymfonysrcSymfonyComponentFormForm.php at line 1019  +
at Form ->normToView (array())
in C:xampphtdocsxxxvendorsymfonysymfonysrcSymfonyComponentFormForm.php at line 332  +
at Form ->setData (array())
in C:xampphtdocsxxxvendorsymfonysymfonysrcSymfonyComponentFormExtensionCoreDataMapperPropertyPathMapper.php at line 59  +
at PropertyPathMapper ->mapDataToForms (object(User), object(RecursiveIteratorIterator))
in C:xampphtdocsxxxvendorsymfonysymfonysrcSymfonyComponentFormForm.php at line 375  +
at Form ->setData (object(User))
in C:xampphtdocsxxxvendorfriendsofsymfonyuser-bundleFOSUserBundleControllerRegistrationController.php at line 49  +
at RegistrationController ->registerAction (object(Request))
at call_user_func_array (array(object(RegistrationController), 'registerAction'), array(object(Request)))
in C:xampphtdocsxxxappbootstrap.php.cache at line 2770  +
at HttpKernel ->handleRaw (object(Request), '1')
in C:xampphtdocsxxxappbootstrap.php.cache at line 2744  +
at HttpKernel ->handle (object(Request), '1', true)
in C:xampphtdocsxxxappbootstrap.php.cache at line 2874  +
at ContainerAwareHttpKernel ->handle (object(Request), '1', true)
in C:xampphtdocsxxxappbootstrap.php.cache at line 2175  +
at Kernel ->handle (object(Request))
in C:xampphtdocsxxxwebapp_dev.php at line 29  +
18
demandé sur user2394156 2013-06-26 12:21:21

4 réponses

Symfony essaie de convertir votre $ role (propriété array) en plusieurs champ de choix (string).

  1. Set plusieurs true dans la forme de votre choix widget.
  2. changer la cartographie de arraychaîne$rôle propriété dans votre entité.
  3. si vous insistez pour que les options ci-dessus restent inchangées, vous pouvez créer DataTransformer. ce n'est pas la meilleure solution parce que vous perdre des données si votre tableau a plus d'un élément.

Exemple:

<?php
namespace 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);
    }
}

et puis dans votre classe de forme:

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));
http://symfony.com/doc/current/cookbook/form/data_transformers.html

28
répondu gregory90 2013-06-27 13:08:32

assurez-vous que vous utilisez le bon type de données dans le fichier ORM. Dans ce cas, votre rôle ne peut pas être une chaîne. Ce doit être une relation many-to-many, un tableau ou json_array.

si vous choisissez l'un d'eux, symfony insérera les données sans effort ou n'importe quel type de transformateur.

E. g.:

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

ainsi, il vivra dans votre base de données comme:

a:2:{i:0;s:4:"user";i:1;s:5:"admin";}
2
répondu Ali Emre Çakmakoğlu 2016-01-24 18:48:59

je viens d'ajouter un DataTransformer sans changer le type de tableau de l'attribut my roles, puis je le mets dans mon UserType :

use AppBundle\Form\DataTransformer\StringToArrayTransformer;

//...

$transformer = new StringToArrayTransformer();    
$builder->get('roles')->addModelTransformer($transformer);

Et ça marche pour moi.

1
répondu Bndev 2018-02-26 13:49:09

j'ai votre problème .. J'ai résolu ce problème avec cette solution. J'espère que cela vous aide

ce code fonctionne sur le formulaire de connexion et d'enregistrement ...

de l'utilisateur de l'entité

class User {
    /**
     * @ORM\Column(type="array")
     */
    private $roles ;

    public function getRoles()
    {
        $roles = $this->roles;
         var_dump($roles);
        if ($roles != NULL) {
            return explode(" ",$roles);
        }else {
           return $this->roles;
        }
    }


  public function setRoles($roles)
    {
        $this->roles = $roles;
    }

UserType

 ->add('roles', ChoiceType::class, array(
            'attr' => array(
                'class' => 'form-control',
                'value' => $options[0]['roles'],
                'required' => false,
            ),
            'multiple' => true,
            'expanded' => true, // render check-boxes
            'choices' => [
                'admin' => 'ROLE_ADMIN',
                'user' => 'ROLE_USER',
            ]
        ))
0
répondu pedram shabani 2018-05-27 17:22:47