I want to create entity with symfony form and DTO. I tried to do DTO and form like I’ve seen on symfonycast. But there’s something wrong and I can’t figure it out.
After sending json file via postman I get an error:
Typed property AppFormModelCreateFacilityDTO::$pitchTypes must not be accessed before initialization (500 Internal Server Error)
postman body:
{
"name": "legia",
"pitchTypes": ["basketball"],
"address": "kosynierów"
}
Can You tell me what I’m doing wrong?
<?php
namespace AppController;
use AppEntityFacility;
use AppFormCreateFacilityFormType;
use AppFormModelCreateFacilityDTO;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAnnotationRoute;
/**
* @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 AppForm;
use AppFormModelCreateFacilityDTO;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;
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 AppFormModel;
class CreateFacilityDTO
{
public string $name;
public array $pitchTypes;
public string $address;
}
Source: Symfony Questions
Was this helpful?
0 / 0