构建内部API端点,允许其他服务更新用户的特定字段,并通过电子邮件地址标识。如果用户不存在,则需要创建。
只提交新用户,代码工作正常。
这是对API端点的POST请求。
[
{
"email":"existing@user.com",
"favouriteFood": "pizza"
},
{
"email":"new@user.com",
"favouriteFood": "sweets"
}
]
控制器操作
public function postUsersAction(Request $request)
{
$form = $this->createForm(UserCollectionType::class);
$form->submit(['users' => json_decode($request->getContent(), true)], true);
if (!$form->isValid()) {
return $form;
}
/** @var User $user */
foreach ($form->getData()['users'] as $user) {
$this->userManager->updateUser($user);
}
$this->em->flush();
return $form->getData()['users'];
}
UserCollectionType
class UserCollectionType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('users', 'collection', [
'allow_add' => true,
'by_reference' => false,
'type' => UserType::class
]);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'csrf_protection' => false,
'cascade_validation' => true
]);
}
public function getBlockPrefix()
{
return '';
}
}
用户类型
class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('email')
->add('favouriteFood', TextType::class);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => User::class,
'validation_groups' => ['user_api'],
'cascade_validation' => true
]);
}
}
如何更新上述代码,以便检查用户是否先存在,否则继续创建一个新的代码当前是如何工作的。
我认为可能已经使用过DataTransformer,但不确定如何使用。
编辑:ShylockTheCamel提出的解决方案
控制器内部。
$post = json_decode($request->getContent(), true);
$users = [];
foreach ($post as $userRaw) {
$user = $this->em->findOneBy($userRaw['email']); // example search logic in the DB
if (!$user) {
$user = new User();
}
$users[] = $user;
}
$form = $this->createForm(UserCollectionType::class, $users);
$form->submit(['users' => $post], true);
答案 0 :(得分:0)
如果我理解正确,当您进入foreach循环时,您的用户实体就会存在。因此,您必须在表单创建过程中创建它们。在这种情况下,为什么不在一个表单验证器中检查用户是否存在?