Ajouter un ImageType à l'intérieur d'un formulaire: "impossible de lire l'index ... n'implémente-t-il pas ArrayAccess"?

j'ai un petit problème avec un type personnalisé dans un champ d'une forme : j'essaie d'ajouter un "ImageType" lié à une entité "Image", qui a "url" et "alt" comme variables.

J'obtiens cette erreur :

ne peut pas lire l'index "url" de l'objet de type "Proxies _ _ CG _ _ OCPlatformBundleEntityImage" parce qu'il ne implémenter ArrayAccess.

voici le Type:

<?php
// src/OC/PlatformBundle/Form/ImageType.php

namespace OCPlatformBundleForm;

use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolverInterface;
use SymfonyComponentFormExtensionCoreTypeTextType;

class ImageType extends AbstractType
{
  public function buildForm(FormBuilderInterface $builder, array $options)
  {
    $builder
      ->add('url', TextType::class)
      ->add('alt', TextType::class)
    ;
  }

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

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

la forme:

class AdvertType extends AbstractType
{
  public function buildForm(FormBuilderInterface $builder, array $options)
  {
    $builder
      ->add('title', TextType::class)
      ->add('date', DateType::class)
      ->add('categories', EntityType::class, array(
            'class'    => 'OCPlatformBundle:Category',
            'choice_label' => 'name',
            'multiple' => true
          ))
      ->add('image', ImageType::class)
      ->add('save', SubmitType::class, array('label' => 'Create Task'))    ;
  }

et le entité :

<?php

namespace OCPlatformBundleEntity;

use DoctrineORMMapping as ORM;

/**
 * Image
 *
 * @ORMTable(name="image")
 * @ORMEntity(repositoryClass="OCPlatformBundleRepositoryImageRepository")
 */
class Image
{
    /**
     * @var int
     *
     * @ORMColumn(name="id", type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORMColumn(name="url", type="string", length=255)
     */
    private $url;

    /**
     * @var string
     *
     * @ORMColumn(name="alt", type="string", length=255)
     */
    private $alt;


    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set url
     *
     * @param string $url
     *
     * @return Image
     */
    public function setUrl($url)
    {
        $this->url = $url;

        return $this;
    }

    /**
     * Get url
     *
     * @return string
     */
    public function getUrl()
    {
        return $this->url;
    }

    /**
     * Set alt
     *
     * @param string $alt
     *
     * @return Image
     */
    public function setAlt($alt)
    {
        $this->alt = $alt;

        return $this;
    }

    /**
     * Get alt
     *
     * @return string
     */
    public function getAlt()
    {
        return $this->alt;
    }
}

Je n'ai pas de tableau dans la classe Image, donc je ne suis pas sûr de ce qui déclenche le problème.

17
demandé sur Paul 2016-01-04 19:22:08

1 réponses

vous recevez cette erreur parce que Symfony est à la recherche de la classe de données de votre type de formulaire mais ne peut pas la trouver. Votre code aurait fonctionné pour Symfony 2.X versions, où setDefaultOptions() valide. En commençant par le Symfony 2.7, cette méthode était dépréciée en faveur de l' configureOptions() et supprimé entièrement en 3.0.

ainsi, votre fonction existe dans votre classe de forme mais elle ne sera jamais référencée par Symfony. Votre barre d'outils de débogage peut même ne pas montrer cette dépréciation car il a été supprimé entièrement en 3.0. Les types de formulaires plus simples peuvent ne pas faire d'erreur si vous faites la même erreur, mais setDefaultOptions() ne sera jamais appelé dans les deux cas, donc, je voudrais aller à travers et vérifiez vos autres formulaires pour s'assurer qu'ils sont valides.

comme solution, changez ceci:

use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class AdvertType extends AbstractType
{
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'OC\PlatformBundle\Entity\Image',
        ));
    }
}

à:

use Symfony\Component\OptionsResolver\OptionsResolver;

class AdvertType extends AbstractType
{
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'OC\PlatformBundle\Entity\Image',
        ));
    }
}
37
répondu Jason Roman 2016-01-04 21:06:54