我在表单的字段中有一个自定义类型的小问题:我正在尝试添加与"图像"实体相关的"ImageType",其中"url"和"alt"作为变量.
我收到此错误:
无法从"Proxies__CG __\OC\PlatformBundle\Entity\Image"类型的对象读取索引"url",因为它没有实现\ ArrayAccess.
这是类型:
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')) ; }
而实体:
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类中没有任何数组,所以我不确定是什么引发了这个问题.
您收到此错误是因为Symfony正在查找表单类型的数据类但找不到它.您的代码适用于Symfony 2.x版本,其中setDefaultOptions()
有效.从Symfony 2.7开始,该方法在3.0中被弃用configureOptions()
并完全删除.
因此,您的函数存在于您的表单类中,但它永远不会被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', )); } }