Добавить 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',
));
}
}