php - 在表单 : "cannot read index ... doesn' t implement\ArrayAccess"? 中添加一个 ImageType

标签 php forms symfony

我对表单字段中的自定义类型有一个小问题:我正在尝试添加一个与“Image”实体相关的“ImageType”,该实体具有“url”和“alt”作为变量。
我收到此错误:

Cannot read index "url" from object of type "Proxies__CG__\OC\PlatformBundle\Entity\Image" because it doesn't implement \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 类中没有任何数组,所以我不确定是什么引发了问题。

最佳答案

您收到此错误是因为 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',
        ));
    }
}

关于php - 在表单 : "cannot read index ... doesn' t implement\ArrayAccess"? 中添加一个 ImageType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34595396/

相关文章:

php - 如何创建 MLM 表设计

php - Facebook PHP 使用 cronjob 发布到粉丝页面?

javascript - 在表单中添加数据库中的下拉列表

php - 如何将用户名变量传递到第三个 php 页面?

php - Symfony 从子文件夹解析 yaml 文件

javascript - jQuery $.post 未正确执行验证

php - SQL 检查当天

reactjs - 单击表单按钮时,Ant Design 表单元素未提交

php - symfony2 : ContextErrorException on production server "Erroneous data format for unserializing"

mysql - 在 Symfony 2.5 和 Doctrine 查询生成器中使用圆括号 ( > )