Php Symfony检查输入数据是否唯一

Php Symfony检查输入数据是否唯一,php,mongodb,symfony,assert,Php,Mongodb,Symfony,Assert,我有一个自定义验证数组,没有如下实体: $dataContent = json_decode($request->getContent(), true); $dataToCheck = [ 'name' => [ new Assert\Required(), new Assert\NotBlank(), new Assert\Type('string'),

我有一个自定义验证数组,没有如下实体:

$dataContent = json_decode($request->getContent(), true);

$dataToCheck = [
            'name' => [
                new Assert\Required(),
                new Assert\NotBlank(),
                new Assert\Type('string'),
                new Assert\Length(['min' => 4]),
            ],
            'nick' => [
                new Assert\Required(),
                new Assert\NotBlank(),
                new Assert\Type('string'),
                new Assert\Length(['min' => 4]),
            ],
            'email' => [
                new Assert\Required(),
                new Assert\NotBlank(),
                new Assert\Email(),
            ]
]

$constraint = new Assert\Collection($dataToCheck);
$violations = $validator->validate($dataContent, $constraint);
在MongoDb中,我有一些用户。我需要检查请求中的“尼克”和“电子邮件”是否唯一。 所以,在添加新用户的过程中,如何向字段添加规则,以检查这些字段在数据库中是否唯一。 在用户更新当前用户Id的详细信息时,如何忽略检查唯一字段


谢谢。

根据文档,其中一个解决方案是如下操作:

您可以创建用户实体 然后定义UserType 您使用验证组是因为,根据您所说的,您不想验证用于更新的唯一字段,而只是为了创建

最后,在控制器中,您可以执行以下操作: 更新:要在没有实体的情况下执行此操作, 根据本文档,您可以使用自定义约束名称(如UniqueCustom)并将其添加到约束数组中。在此自定义约束中,您可以检查MongoDB中是否已经存在相应的电子邮件或nick。若要忽略此更新检查,可以使用如上所述的验证组。因此,您的约束数组似乎只是一个想法:

$dataToCheck = [
            'email' => [
                new Assert\Required(['groups' => ['new', 'edit']]),
                new Assert\NotBlank(['groups' => ['new', 'edit']]),
                new Assert\Type('string'),
                new Assert\Email(['groups' => ['new', 'edit']]),
                new UniqCustom(['groups' => ['new']]) // Custom uniq constraint
            ],
            'nick' => [
                new Assert\Required(['groups' => ['new', 'edit']]),
                new Assert\NotBlank(['groups' => ['new', 'edit']]),
                new Assert\Type('string'),
                new Assert\Length(['min' => 4, 'groups' => ['new', 'edit']]),
                new UniqCustom(['groups' => ['new']])
            ],
            'name' => [
                new Assert\Required(['groups' => ['new', 'edit']]),
                new Assert\NotBlank(['groups' => ['new', 'edit']]),
                new Assert\Type('string'),
                new Assert\Length(['min' => 4, 'groups' => ['new', 'edit']]),
            ],

        ];
ODM的过程与用户ORM类似。
我希望这个解决方案的尝试能对您有所帮助。

请查看更多信息。我已经看过了,但我不知道如何实现我的示例。如果您能为我的示例编写小的实现,我将不胜感激。谢谢,谢谢。但我知道如何在你们介绍的例子中做到这一点。在我的例子中,我不能使用实体。我需要在没有实体的情况下做这件事。就像我上面的例子一样。有可能吗?
namespace Acme\AccountBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Acme\AccountBundle\Document\User;

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('email', EmailType::class)
                ->add('nick', TextType::class)
                ->add('name', TextType::class);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => User::class,
            'validation_groups' => ['new', 'edit']
        ));
    }
}
namespace Acme\AccountBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;

use Acme\AccountBundle\Form\Type\UserType;
use Acme\AccountBundle\Document\User;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;

class AccountController extends Controller
{
    /**
     * @Route("/users/create", name="app_users_create)
     */
    public function createAction()
    {

        $dataContent = json_decode($request->getContent(), true);
        if ($dataContent === null || !is_array($dataContent)) {
             // Throw exception for invalid format request
        }
        $dm = $this->get('doctrine_mongodb')->getManager();
        $user = new User();

        $form = $this->createForm(UserType::class, $user);    
        $form->submit($dataContent);

        if ($form->isSubmitted() && $form->isValid()) {

           $dm->persist($user);
           $dm->flush();

           // Return something for success
        }

        // Return Form error
    }

    /**
     * @Route("/users/edit", name="app_users_edit)
     * @Security("is_granted('IS_AUTHENTICATED_REMEMBERED')")
     */
    public function updateAction()
    {

        $dataContent = json_decode($request->getContent(), true);
        if ($dataContent === null || !is_array($dataContent)) {
             // Throw exception for invalid format request
        }
        $dm = $this->get('doctrine_mongodb')->getManager();
        $user = $this->getUser();

        $form = $this->createForm(UserType::class, $user);    
        $form->submit($dataContent); 

        if ($form->isSubmitted() && $form->isValid()) {

           $dm->flush();

           // Return something for success
        }

        // Return Form error
    }

}
$dataToCheck = [
            'email' => [
                new Assert\Required(['groups' => ['new', 'edit']]),
                new Assert\NotBlank(['groups' => ['new', 'edit']]),
                new Assert\Type('string'),
                new Assert\Email(['groups' => ['new', 'edit']]),
                new UniqCustom(['groups' => ['new']]) // Custom uniq constraint
            ],
            'nick' => [
                new Assert\Required(['groups' => ['new', 'edit']]),
                new Assert\NotBlank(['groups' => ['new', 'edit']]),
                new Assert\Type('string'),
                new Assert\Length(['min' => 4, 'groups' => ['new', 'edit']]),
                new UniqCustom(['groups' => ['new']])
            ],
            'name' => [
                new Assert\Required(['groups' => ['new', 'edit']]),
                new Assert\NotBlank(['groups' => ['new', 'edit']]),
                new Assert\Type('string'),
                new Assert\Length(['min' => 4, 'groups' => ['new', 'edit']]),
            ],

        ];