Symfony类型“object”的值无法转换为有效的数组键

时间:2016-01-26 20:23:07

标签: php symfony

我试图从实体创建一个表单,但遇到了一些麻烦。

这是我的FormType

namespace AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class EditPhotoFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('title', 'text');
    $builder->add('description', 'textarea');
        $builder->add('category', 'choice', array(
            'choices' => array(
                '1' => 'categories.uncategorized',
                'categories.photography.photography'   => array(
                    '5' => 'categories.photography.abstract',
                    '6' => 'categories.photography.animals',
                    '7' => 'categories.photography.blackandwhite',
                    '8' => 'categories.photography.architecture',
                    '9' => 'categories.photography.fashion',
                    '10' => 'categories.photography.food',
                    '11' => 'categories.photography.landscapes',
                    '12' => 'categories.photography.macro', 
                    '13' => 'categories.photography.people',
                    '14' => 'categories.photography.sport'
                ),
                'categories.painting.painting' => array(
                    '15' => 'categories.painting.landscapes',
                    '16' => 'categories.painting.seascapes',
                    '17' => 'categories.painting.portrait',
                    '18' => 'categories.painting.stilllife',
                    '19' => 'categories.painting.architecture',
                    '20' => 'categories.painting.fantasy'
                 ),
                'categories.3d.3d'   => array(
                    '21' => 'categories.3d.interiors',
                    '22' => 'categories.3d.exteriors',
                    '23' => 'categories.3d.creative'
                ),
            ),
        ));
    }

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

这是我的控制器。

$em = $this->getDoctrine()->getManager();

    $photo = $em->getRepository('AppBundle:Photo')->find($photoId);

    $form = $this->createForm('app_photo_edit', $photo);

    return $this->render('AdminBundle::edit.html.twig', array('form' => $form->createView(), 'photo' => $photo));

照片实体

<?php
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity
 * @ORM\Table(name="photos")
 */
class Photo
{
    const
            CATEGORY_PHOTOGRAPHY = 1,
            CATEGORY_PAINTING = 2,
            CATEGORY_3D = 3;

    /*
     * Flow photos limit
     */
    const FLOW_PHOTOS_LIMIT = 15;

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="photos")
     */
    protected $user;

    /**
     * @ORM\Column(type="text", nullable=true)
     */
    protected $title;

    /**
     * @ORM\Column(type="text", nullable=true)
     */
    protected $description;

    /**
     * @ORM\Column(type="text")
     */
    protected $name;

    /**
     * @ORM\ManyToOne(targetEntity="PhotoCategory")
     */
    protected $category;

    /**
     * @ORM\Column(name="creation_date", type="datetime")
     */
    protected $creationDate;

    /**
     * @ORM\Column(name="edit_date", type="datetime", nullable=true)
     */
    protected $editDate;

    /**
     * @ORM\Column(name="is_moderated", type="boolean")
     */
    protected $isModerated = false;

    /**
     * @ORM\Column(name="moderation_date", type="datetime", nullable=true)
     */
    protected $moderationDate;

    /**
     * @ORM\Column(name="is_active", type="boolean")
     */
    protected $isActive = true;

    /**
     * @ORM\OneToMany(targetEntity="Comment", mappedBy="photo")
     * @ORM\OrderBy({"id" = "DESC"})
     */
    protected $comments;

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set user
     *
     * @param User $user
     *
     * @return Photo
     */
    public function setUser($user)
    {
        $this->user = $user;

        return $this;
    }

    /**
     * Get user
     *
     * @return User $user
     */
    public function getUser()
    {
        return $this->user;
    }

    /**
     * Get category
     *
     * @return Category $category
     */
    public function getCategory()
    {
        return $this->category;
    }

    /**
     * Set title
     *
     * @param string $title
     *
     * @return Photo
     */
    public function setTitle($title)
    {
        $this->title = $title;

        return $this;
    }

    /**
     * Get title
     *
     * @return string
     */
    public function getTitle()
    {
        return $this->title;
    }

    /**
     * Get creationDate
     *
     * @return \DateTime
     */
    public function getCreationDate()
    {
        return $this->creationDate;
    }

    /**
     * Get editDate
     *
     * @return \DateTime
     */
    public function getEditDate()
    {
        return $this->editDate;
    }

    /**
     * Get moderationDate
     *
     * @return \DateTime
     */
    public function getModerationDate()
    {
        return $this->moderationDate;
    }

    /**
     * Get is active
     *
     * @return integer
     */
    public function isActive()
    {
        return $this->isActive;
    }

    /**
     * Get is moderated
     *
     * @return integer
     */
    public function isModerated()
    {
        return $this->isModerated;
    }

    /*
     * Get image
     * 
     * @return string
     */
    public function getImage()
    {
        return $this->getWebDirectory().$this->getName();
    }

    /*
     * Get image directory 
     * 
     * @return string
     */
    public function getDirectory()
    {
        return __DIR__.'/../../../web/uploads/photos/'.$this->getUser()->getId().'/'.$this->creationDate->format('Y-m-d').'/';
    }

    /*
     * Get image web directory
     * 
     * @return string
     */
    public function getWebDirectory()
    {
        return '/web/uploads/photos/'.$this->getUser()->getId().'/'.$this->creationDate->format('Y-m-d').'/';
    }

    /*
     * Get comments
     */
    public function getComments()
    {
        return $this->comments;
    }

    /**
     * Set description
     *
     * @param string $description
     *
     * @return Photo
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Set name
     *
     * @param string $name
     *
     * @return Photo
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set creationDate
     *
     * @param \DateTime $creationDate
     */
    public function setCreationDate(\DateTime $creationDate)
    {
        $this->creationDate = $creationDate;
    }

    /**
     * Set editDate
     *
     * @param \DateTime $editDate
     */
    public function setEditDate(\DateTime $editDate)
    {
        $this->editDate = $editDate;
    }

    /**
     * Set moderationDate
     *
     * @param \DateTime $moderationDate
     */
    public function setModerationDate(\DateTime $moderationDate)
    {
        $this->moderationDate = $moderationDate;
    }

    /**
     * Set active
     */
    public function setActive($active)
    {
        $this->isActive = $active;
    }

    /**
     * Set category
     */
    public function setCategory($category)
    {
        $this->category = $category;
    }

    /**
     * Set moderated
     */
    public function setModerated($moderated)
    {
        $this->isModerated = $moderated;
    }

    /*
     * Delete image (Used when didnt pass moderation)
     */
    public function deleteImage() {
    return unlink($this->getDirectory().$this->getName());
    }
}

我得到错误:“object”类型的值无法转换为有效的数组键。

问题出在FormType类别中,但我不知道如何正确地做到这一点。

谢谢

2 个答案:

答案 0 :(得分:3)

我认为问题是由嵌套数组引起的:

'categories.photography.photography'   => array(...)

如果你把简单的密钥=&gt;值数组它应该工作。例如:

$builder->add('type', 'choice', 
array(
'label'=>'My own label', 
'choices'=>array('verb'=>'Displayed verb', 'noun'=>'Displayed noun', 'adjective'=>'Displayed adjective', 'adverb'=>'Displayed adverb')));

对于您的表单,我建议您创建3个单独的选择字段。

答案 1 :(得分:-3)

  • 您无法在所选类别
  • 中定义1个键数组的2个值
  • 您的索引键数组错误
  • 您无法使用此代码
  • 在数组中插入数组
  • 你的重叠对象太奇怪了
  • 您的制表代码是随机的或随机的
  • 2 builder-&gt; add()在1 formType
  • 中没有必要

解决代码中的所有问题,您的代码运行得更好。