Validation Symfony2注册的单独实体验证

Validation Symfony2注册的单独实体验证,validation,symfony,entity,unique,Validation,Symfony,Entity,Unique,问题是,如何为唯一用户名添加验证?我可以通过$user->findByUsername(…)简单地检查它,但这样我就不会有正确的错误 主要的问题是表单实体(约束)和(ORM)实体是分开的 用户: use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Security\Core\User\UserInterface; /** * @ORM\Table(name="_account") */ class User implements U

问题是,如何为唯一用户名添加验证?我可以通过$user->findByUsername(…)简单地检查它,但这样我就不会有正确的错误

主要的问题是表单实体(约束)和(ORM)实体是分开的

用户:

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;

/**
 * @ORM\Table(name="_account")
 */
class User implements UserInterface
{


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

/**
 * @var string
 * 
 * @ORM\Column(name="usrename", type="string", length=255)
 */
protected $username;

// ...........
}
注册:

use Symfony\Component\Validator\Constraints as Assert;

class Registration
{

/** accountName
 * @Assert\NotBlank()
 * @Assert\Regex
 * (
 *      pattern="/^[a-zA-Z0-9]{1,}$/i",
 *      message="You use illegal character(s). Must be a-z, A-Z and 0-9 symbols."
 * )
 * @Assert\Length
 * (
 *      min="4",
 *      minMessage="User name must be more then 3 characters.",
 *      max="25",
 *      maxMessage="User name must be less then 25 characters."
 * )
 */
protected $accountName;

public function setAccountName($accountName)
{
    $this->accountName = $accountName;
}
// ............
}
注册类型:

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

class RegistrationType extends AbstractType
{

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('accountName', 'text', array('label' => 'Account Name'))
            ->add('accountPass', 'repeated', array(
                'type' => 'password',
                'first_name' => 'Password',
                'second_name' => 'Confirm'))
            ->add('accountMail', 'text', array('label' => 'Account Email'))
            ->add('accountTerm', 'checkbox', array('label' => 'Our Terms of use'));
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Some\NewBundle\Form\Registration',
        'required' => false,
        'csrf_protection' => false
    ));
}
// ..........
}
最后一个是控制器

class RegistrationController extends Controller
{

public function defaultAction()
{
    $form = $this->createForm(new RegistrationType(), new Registration);

    if ($this->getRequest()->isMethod('post'))
    {
        $form->bind($this->getRequest());
        if ($form->isValid())
        {
            $em = $this->getDoctrine()->getEntityManager();
            $ef = $this->get('security.encoder_factory');

            $user = new User();


            $data = $form->getData();
            $pass = $ef->getEncoder($user)->encodePassword($data->getAccountPass(), $user->getSalt());

            $user->setPassword($pass);
            $user->setUsername($data->getAccountName());
            $user->setEmail($data->getAccountMail());

            // changed from here
            $userErrors = $this->get('validator')->validate($user);
            if (count($userErrors) > 0)
            {
                foreach ($userErrors as $error)
                {
                    $form->addError(new FormError($error));
                    //$form->get($error->getPropertyPath())->addError($error->getMessage());
                }
            } else
            {
                $em->persist($user);
                $em->flush();
            }
        }
    }
    // ..............
    }}

这是Doctorine2 Uniquentity constraint的工作

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Table(name="_account")
 * @UniqueEntity("username")
 */
class User implements UserInterface
{


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

/**
 * @var string
 * 
 * @ORM\Column(name="username", type="string", length=255, unique=true)
 */
protected $username;

// ...........
}
我还在
username
列的表结构中添加了unicity(unique=true)

编辑:

当处理表单中与持久化实体不同的实体时,必须明确验证ORM实体:

public function defaultAction()
{
    $form = $this->createForm(new RegistrationType(), new Registration);

    if ($this->getRequest()->isMethod('post'))
    {
        $form->bind($this->getRequest());
        if ($form->isValid())
        {
            $em = $this->getDoctrine()->getEntityManager();
            $ef = $this->get('security.encoder_factory');

            $user = new User();


            $data = $form->getData();
            $pass = $ef->getEncoder($user)->encodePassword($data->getAccountPass(), $user->getSalt());

            $user->setPassword($pass);
            $user->setUsername($data->getAccountName());
            $user->setEmail($data->getAccountMail());

            if ($this->get('validator')->validate(user))
            {
                $em->persist($user);
                $em->flush();
            }
            else
            {
                $form->addError(/* ... */);
            }
        }
    }
    // ..............
}

我让您了解如何在表单中添加错误…

这没有意义,我尝试过,但它添加了无论是否存在@uniquentity and unique=true,命令$em->persist()都会添加具有现有用户名的新用户:(您是否修复了键入“usrename”的错误)在您原始帖子的列名中?好的,我没有看到表单实体与持久化的表单实体不同…为什么?我编辑了我的答案…如果($this->get('validator')->validate(user))始终返回我true(@uniquentity,unique=true不工作):(validator$userErrors=$this->get('validator')->validate($user)就这样做了);if(count($userErrors)>0{$form->addError($userErrors);}else{$em->persist($user);$em->flush();}