Добавить ImageType внутри формы: "Не удается прочитать индекс... не реализует \ArrayAccess"?

У меня небольшая проблема с пользовательским типом в поле формы: я пытаюсь добавить "ImageType", связанный с объектом "Image", который имеет "url" и "alt" в качестве переменных.
Я получаю эту ошибку:

Невозможно прочитать индекс "url" из объекта типа "Proxies__CG __\OC\PlatformBundle\Entity\Image", потому что это не реализовать \ArrayAccess.

Вот Тип:

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

namespace OC\PlatformBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\Extension\Core\Type\TextType;

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' => 'OC\PlatformBundle\Entity\Image'
    ));
  }

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

Форма:

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'))    ;
  }

И сущность:

<?php

namespace OC\PlatformBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Image
 *
 * @ORM\Table(name="image")
 * @ORM\Entity(repositoryClass="OC\PlatformBundle\Repository\ImageRepository")
 */
class Image
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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

    /**
     * @var string
     *
     * @ORM\Column(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;
    }
}

У меня нет класса Array в классе Image, поэтому я не уверен, что это проблема.

Ответы

Ответ 1

Вы получаете эту ошибку, потому что Symfony ищет класс данных вашего типа формы, но не может его найти. Ваш код работал бы в версиях Symfony 2.x, где setDefaultOptions() был действительным. Начиная с Symfony 2.7, этот метод был устарел в пользу configureOptions() и полностью удалился в 3.0.

Итак, ваша функция существует в вашем классе формы, но Symfony на нее никогда не ссылается. Панель инструментов отладки может даже не показывать эту усталость, поскольку она полностью удалена в версии 3.0. Более простые типы форм могут не ошибиться, если вы сделаете эту же ошибку, но setDefaultOptions() никогда не будет вызван ни в одном случае, поэтому я бы прошел и проверил ваши другие формы, чтобы убедиться, что они также действительны.

В качестве решения измените это:

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',
        ));
    }
}