fosuserbundle字段上的UniqueEntity不起作用

时间:2014-08-14 19:17:57

标签: symfony doctrine-orm unique-constraint

在我的课堂上,我对"用户"有一个UniqueEntity限制。字段(最初是" user"和#34; name"的组合),它来自fosuserbundle,如果我将约束放在" name"例如,约束完成它的工作,我得到一个错误,说它不是唯一的。这不会发生在用户字段上,但是,我没有收到任何错误,并且实体已添加到我的数据库中。有人可以指出我犯的错误吗?

namespace CB\DefaultBundle\Entity;

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

/**
 * CustomList
 *
 * @ORM\Table()
 * @ORM\Entity
 * @UniqueEntity("user")
 */
class CustomList
{
/**
 * @var integer
 *
 * @ORM\Column(name="Id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 * @Assert\NotBlank()
 * @ORM\Column(name="name", type="string", length=255)
 */
private $name;

/**
 * @var string
 * 
 * @ORM\Column(name="description", type="string", length=255, nullable=true)
 */
private $description;



/**
 * @ORM\ManyToOne(targetEntity="User", inversedBy="customlists")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="Id")
 */
private $user;

/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\ManyToMany(targetEntity="CB\DefaultBundle\Entity\Site", inversedBy="customlists")
* @ORM\JoinTable(name="customlist_site",
*   joinColumns={
* @ORM\JoinColumn(name="customlist_id", referencedColumnName="Id")
*   },
*   inverseJoinColumns={
* @ORM\JoinColumn(name="site_id", referencedColumnName="Id")
*   }
* )
*/
private $sites;

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

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

    return $this;
}

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

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

    return $this;
}

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

/**
 * Set category
 *
 * @param \CB\DefaultBundle\Entity\Category $category
 * @return CustomList
 */
public function setCategory(\CB\DefaultBundle\Entity\Category $category = null)
{
    $this->category = $category;

    return $this;
}

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

/**
 * Set user
 *
 * @param \CB\DefaultBundle\Entity\User $user
 * @return CustomList
 */
public function setUser(\CB\DefaultBundle\Entity\User $user = null)
{
    $this->user = $user;

    return $this;
}

/**
 * Get user
 *
 * @return \CB\DefaultBundle\Entity\User 
 */
public function getUser()
{
    return $this->user;
}
/**
 * Constructor
 */
public function __construct()
{
    $this->sites = new \Doctrine\Common\Collections\ArrayCollection();
}

/**
 * Add sites
 *
 * @param \CB\DefaultBundle\Entity\Site $sites
 * @return CustomList
 */
public function addSite(\CB\DefaultBundle\Entity\Site $sites)
{
    $this->sites[] = $sites;

    return $this;
}

/**
 * Remove sites
 *
 * @param \CB\DefaultBundle\Entity\Site $sites
 */
public function removeSite(\CB\DefaultBundle\Entity\Site $sites)
{
    $this->sites->removeElement($sites);
}

/**
 * Get sites
 *
 * @return \Doctrine\Common\Collections\Collection 
 */
public function getSites()
{
    return $this->sites;
}

}

1 个答案:

答案 0 :(得分:0)

好的,我发现了我的错误,它在我的控制器逻辑中:

...
        $list = new CustomList();

        $form = $this->createForm(new CustomListType(), $list);
        $form->submit($request);
        $list = $form->getData();


        $validator = $this->get('validator');           
        $errors = $validator->validate($list);

        var_dump((string) $errors);

        if ($form->isValid()){


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

            //set current user as user-value of this list
            $list->setUser($this->getUser());

            $em->persist($list);
            $em->flush();

            //prepare the response, e.g.
            $response = array("code" => 100, "success" => true);
            //you can return result as JSON  , remember to 'use' Response!
            return new Response(json_encode($response));  
       ...

正如您所看到的,我在表单验证后设置了用户,这意味着它总是会验证空值,如下面的文档中所示:UniqueEntity ignoreNull的默认值为true,这意味着它会总是通过测试。

移动$ list-> setUser($ this-> getUser());在我验证表单之前修改了这个问题!