我的应用程序中有以下实体类:
<?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重复条目 'admin@scire.com'为关键'UNIQ_D8183973E7927C74'
这是错的!有谁知道如何解决这个问题?
答案 0 :(得分:23)
问题解决如下:
@UniqueEntity(fields={"email"}, groups={"registration"})
@UniqueEntity(fields={"username"}, groups={"registration"})
注册组丢失了,我需要将它们分成两个单独的注释。
答案 1 :(得分:13)
此问题的另一个原因是,如果您使用表单集合并包含处理关联实体的子表单,则必须在根目录中设置cascade_validation
到true
以及所有子表单
请参阅Symfony documentation中的提示:
要激活对CategoryType的验证,请将
cascade_validation
选项添加到TaskType
:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\TaskBundle\Entity\Task',
'cascade_validation' => true,
));
}
<强>更新强>
为了确保您的子实体得到验证,甚至有更好的方法。出于这个原因,Symfony提供了Valid
约束。来自documentation:
<强>有效强>
此约束用于对作为要验证的对象的属性嵌入的对象启用验证。这允许您验证对象以及与之关联的所有子对象。
答案 2 :(得分:3)
请注意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
答案 3 :(得分:2)
尝试添加
framework:
validation:
enable_annotations: true
到您的应用配置