Symfony使用表单更新实体


Symfony update entity with form

我正在构建一个简单的restfull API,其中包含基本的crud操作。

我试图通过PUT请求更新实体,但我的表单没有验证,并且在发送PUT请求时也没有出现任何错误。我做错了什么?仅供参考,具有相同FormType的postAction确实有效!

EventController::putEventsAction

/**
 * Update excisting event.
 *
 * @return event
 */
public function putEventsAction($id, Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $event = $em->find('JdsApiBundle:Event', $id);
    if(!$event) {
        $view = $this->view(["id" => $id], Codes::HTTP_NOT_FOUND);
        return $this->handleView($view);
    }
    $form = $this->createForm(EventType::class, $event);
    $form->handleRequest($request);
    if ($form->isValid()) {
        $em->persist($event);
        $em->flush();
        $view = $this->view($event, Codes::HTTP_OK);
        return $this->handleView($view);
    }
    $logger = $this->get('logger');
    $logger->info((string) $form->getErrors(true));
    return (string) $form->getErrors(true);
    // return array(
    //  'form' => $form,
    // );
}

事件类型

class EventType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('startDate', DateTimeType::class, array(
                'widget' => 'single_text',
                'format' => 'yyyy-MM-dd', // this is actually the default format for single_text
            ))
            ->add('endDate', DateTimeType::class)
            ->add('description')
            ->add('color')
        ;
    }
    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'csrf_protection' => false,
            'data_class' => 'Jds'ApiBundle'Entity'Event'
        ));
    }
}

尝试在表单中添加PUT方法,如下所示:

$form = $this->createForm(EventType::class, $event, array('method' => 'PUT'));

我使用了我自己的代码

public function userPasswordEdit(EntityManagerInterface $entityManager, Request $request, UserPasswordHasherInterface $passwordHasher): Response
{
    $user = $this->getUser();
    $form = $this->createForm(EditPasswordType::class, $user);
    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()){
        $plainPassword = $form->get('password')->getData();
        $repeatPlainPassword = $form->get('repeatPassword')->getData();
        if ($repeatPlainPassword === $plainPassword){
            $hashedPassword = $passwordHasher->hashPassword($user, $plainPassword);
            $user->setPassword($hashedPassword);
            $entityManager->persist($user);
            $entityManager->flush();
            $this->addFlash('success', 'Wachtwoord is succesvol gewijzigd!');
            return $this->redirectToRoute('user_profile');
        } else {
            echo "<script>alert('Ingevoerde wachtwoorden komen niet overeen!')</script>";
        }

    }