2016-01-04 1 views
14

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

Не можете прочитать индекс "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; 
    } 
} 

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

+0

Вы, возможно, потребуется реализовать GetParent) 'функцию' (чтобы показать, что вы хотите, чтобы это продлить 'EntityType 'class (Symfony \ Bridge \ Doctrine \ Form \ Type \ EntityType) –

+0

@JasonRoman Спасибо, я отредактировал мое сообщение, я добавил' getParent() ', но он выдает ошибку. – Paul

+0

Думая об этом больше, вы бы не хотели, чтобы это был EntityType, потому что у вас есть новая форма с несколькими полями, и EntityType будет единственным выбором, который вы выбираете. Вы создали шаблон Twig для своего нового поля? –

ответ

30

Вы получили эту ошибку, потому что Symfony ищет класс данных вашего типа формы, но не может его найти. Ваш код работал бы в версиях Symfony 2.x, где setDefaultOptions() был действителен. Начиная с Symfony 2.7, этот метод был deprecated in favor of 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', 
     )); 
    } 
} 
+0

Он также работает как шарм, если вы меняете data_class на Image :: class – murtho

+0

Правда, и с более новой версией Symfony, которая должна быть предпочтительным методом –

Смежные вопросы