如何正确呈现表单?

时间:2016-01-19 11:07:33

标签: php forms symfony doctrine-orm

Symfony让这一切变得如此简单。它列出了你的项目的大线,没有任何问题。直到出现问题。您将在几天内寻找合适的解决方案。至少那就是我现在正在做的事情。

我正在开发一个小测试项目,您可以在其中添加网址作为书签,并为每个网址提供各种标记以对网址进行分类。

我使用generate:doctrine:crud命令来构建表单。但我得到了一个奇怪的错误。

An exception has been thrown during the rendering of a template ("Catchable Fatal Error: Object of class Bla\LinkBundle\Entity\Url could not be converted to string") in form_div_layout.html.twig at line 13. 

我可以通过在我的Url实体中添加__toString()方法来解决此问题,但我想知道原因。

问题在于name属性为null。如果我将此值作为''使用__toString()返回,则可以正常工作。但我不喜欢这个解决方案。当我处于“创建网址”表单时,所有其他值都是null,那么为什么抱怨name属性?

表格

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name')
        ->add('url')
        ->add('flags')
        ->add('tags', EntityType::class, array(
            'class' => 'Bla\LinkBundle\Entity\Tag',
            'choice_label' => 'name',
            'multiple' => true,
        ))
    ;
}

控制器

public function newAction(Request $request)
{
    $url = new Url();
    $form = $this->createForm('Bla\LinkBundle\Form\UrlType', $url);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($url);
        $em->flush();

        return $this->redirectToRoute('url_show', array('id' => $url->getId()));
    }

    return $this->render('url/new.html.twig', array(
        'url' => $url,
        'form' => $form->createView(),
    ));
}

实体

namespace Bla\LinkBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Bla\LinkBundle\Entity\Tag;

/**
 * URL
 *
 * @ORM\Table(name="urls")
 * @ORM\Entity
 */
class Url
{
    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255, nullable=false)
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(name="url", type="text", length=65535, nullable=false)
     */
    private $url;

    /**
     * @var integer
     *
     * @ORM\Column(name="flags", type="integer", nullable=false)
     */
    private $flags;

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="bigint")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @ORM\ManyToMany(targetEntity="\Bla\LinkBundle\Entity\Tag", cascade={"persist"})
     * @ORM\JoinTable(name="url_tag",
     *      joinColumns={@ORM\JoinColumn(name="url_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id", unique=true)}
     *      )
     */
    protected $tags;

    public function __construct()
    {
        $this->tags = new ArrayCollection();
    }

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

        return $this;
    }

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

    /**
     * Set url
     *
     * @param string $url
     *
     * @return Urls
     */
    public function setUrl($url)
    {
        $this->url = $url;

        return $this;
    }

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

    /**
     * Set flags
     *
     * @param integer $flags
     *
     * @return Urls
     */
    public function setFlags($flags)
    {
        $this->flags = $flags;

        return $this;
    }

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

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


    /**
     * @param \Doctrine\Common\Collections\ArrayCollection $tags
     * @return Urls
     */
    public function setTags($tags)
    {
        $this->tags = $tags;
        return $this;
    }

    /**
     * @return \Doctrine\Common\Collections\ArrayCollection
     */
    public function getTags()
    {
        return $this->tags;
    }

    /**
     * Add tag
     *
     * @param Tag $tag
     * @return Urls
     */
    public function addTag(Tag $tag)
    {
        $this->tags->add($tag);

        return $this;
    }

    /**
     * Remove tag
     *
     * @param Tags $tag
     */
    public function removeTag(Tag $tag)
    {
        $this->tags->removeElement($tag);
    }
}

1 个答案:

答案 0 :(得分:0)

尝试将其实现为表单类:

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

public function getParent()
{
    return 'multiselectentity';
}