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']]),
],
];