首页 > 解决方案 > Symfony - 如何使用表单和 DTO 创建实体

问题描述

我想用 symfony 表单和 DTO 创建实体。我试着像在 symfonycast 上看到的那样做 DTO 和表格。但是有什么问题,我想不通。

通过邮递员发送 json 文件后,出现错误:

类型化属性 App\Form\Model\CreateFacilityDTO::$pitchTypes 在初始化之前不能访问(500 Internal Server Error)

邮递员身体:

{“名称”:“legia”,“pitchTypes”:[“篮球”],“地址”:“kosynierów”}

你能告诉我我做错了什么吗?

<?php

namespace App\Controller;

use App\Entity\Facility;
use App\Form\CreateFacilityFormType;
use App\Form\Model\CreateFacilityDTO;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;


/**
 * @method saveEntities(array $array)
 */
class CreateFacilityAction extends AbstractController
{
    /**
     * @Route("/api/create/facility", name="create_facility")
     * @param Request $request
     * @return Response
     */
    public function __invoke(Request $request, EntityManagerInterface $em)
    {
        $form = $this->createForm(CreateFacilityFormType::class);
        $data = json_decode($request->getContent(), true);
        $form->submit($data);
//        if ($form->isSubmitted() && $form->isValid()) {
            /** @var CreateFacilityDTO $facilityDto */
            $facilityDto = $form->getData();
            $createFacility = new Facility($facilityDto->name, $facilityDto->pitchTypes,
                $facilityDto->address);

            $em = $this->getDoctrine()->getManager();
            $em->persist($createFacility);
            $em->flush();
//            return new Response($data, 201);
//        }
        return new Response($createFacility, 201);

    }
}
<?php

namespace App\Form;

use App\Form\Model\CreateFacilityDTO;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class CreateFacilityFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('pitchTypes')
            ->add('address');
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => CreateFacilityDTO::class,
        ]);
    }
}

<?php


namespace App\Form\Model;


 class CreateFacilityDTO
{
    public string $name;

    public array $pitchTypes;

    public string $address;
}

标签: phpformssymfonydto

解决方案


推荐阅读