为什么我的Symfony2 @UniqueEntity约束根本无法工作?
我有以下的实体类在我的应用程序:为什么我的Symfony2 @UniqueEntity约束根本无法工作?
<?php
namespace ...;
// use ...
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;;
// ...
/**
* @ORM\Table(name="sc_user")
* @ORM\Entity(repositoryClass="...\UserRepository")
* @ORM\HasLifecycleCallbacks()
* @UniqueEntity(fields={"email", "username"})
*/
class User implements UserInterface, \Serializable, EquatableInterface
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string $email
*
* @ORM\Column(name="email", type="string", length=255, unique=true)
*
* @Assert\NotBlank(groups={"registration"})
* @Assert\Email(groups={"registration"})
*/
private $email;
/**
* @var string $username
*
* @ORM\Column(name="username", type="string", length=32, unique=true)
*
* @Assert\NotBlank(groups={"registration"})
*/
private $username;
// ...
}
的@UniqueEntity约束被忽略。我尝试不同的口味,包括:
@UniqueEntity(fields={"email", "username"})
和
@UniqueEntity(fields={"email"})
@UniqueEntity(fields={"username"})
,并按照这里的Symfony2的文档:http://symfony.com/doc/current/reference/constraints/UniqueEntity.html
@UniqueEntity("email")
@UniqueEntity("username")
没有我这样做,工作。非但没有如预期的表单验证错误的,我得到以下异常:
SQLSTATE [23000]:完整性约束违规:1062重复条目 “[email protected]”关键“UNIQ_D8183973E7927C74”
这是错的!有谁知道如何解决这个问题?
问题解决如下:
@UniqueEntity(fields={"email"}, groups={"registration"})
@UniqueEntity(fields={"username"}, groups={"registration"})
注册组人失踪,我需要把它们分开成两个单独的注释。
尝试添加
framework:
validation:
enable_annotations: true
到您的应用程序配置
此问题的另一个原因是,如果您使用表单集合并包含处理关联实体的子表单,则必须在根和所有子表单中将cascade_validation
设置为true
。
要在CategoryType激活验证,添加
cascade_validation
选项TaskType
:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\TaskBundle\Entity\Task',
'cascade_validation' => true,
));
}
更新:
为了确保你的孩子实体得到验证,甚至有更好的方法。正因如此,Symfony提供了Valid
约束。从documentation:
有效
这个约束用于启用对作为对象的属性被验证被嵌入的对象的验证。这使您可以验证对象及与其关联的所有子对象。
这是这里只有有用和正确的答案。 – VisioN 2015-12-03 19:26:43
请注意ignoreNull
例如与PID正常工作(可以为null):
constraints:
- Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity:
fields: [page, pid, position]
errorPath: page
groups: [Menu]
message: "Page already exists with that parent"
ignoreNull: false
这是我的问题的答案。谢谢! – nataliastanko 2016-03-08 15:34:34
+1感谢!那工作的一种享受! – coder4show 2013-06-25 15:44:12
嗨,Josef,似乎有点老问题,但我遇到同样的问题 - 只是想知道 - 你需要,我不知道,__create__验证组在某处?我完全按照你的方式添加了唯一的实体字段,只能在电子邮件和手机上添加,但它仍然给我一个异常而不是验证错误。有任何想法吗? – iLikeBreakfast 2014-01-07 19:57:15
@iLikeBreakfast您需要在FormType中的setDefaultOptions方法中声明验证组。 – ferdynator 2014-07-30 12:46:46