Saya agak baru menggunakan Symfony 5.4 dan baru-baru ini mencipta API pertama saya menggunakan versi ini
Untuk titik akhir API khusus saya, salah satu parameter ialah tatasusunan ID.
Saya perlu mengesahkan tatasusunan melalui:
Saya melaksanakannya dengan cara yang mudah, menyemak tatasusunan sebelum meneruskan entiti menggunakan taip dan sedia ada Repository
:
$parentPropertyIds = (array)$request->request->get('parent_property_ids'); if ($parentPropertyIds) { $parentCount = $doctrine->getRepository(Property::class)->countByIds($parentPropertyIds); if ($parentCount !== count($parentPropertyIds)) { return $this->json([ 'status' => 'error', 'message' => 'parent_property_id_invalid' ], 422); } foreach ($parentPropertyIds as $parentPropertyId) { $parentProperty = $doctrine->getRepository(Property::class)->find($parentPropertyId); $property->addParent($parentProperty); } }
Walau bagaimanapun, ini menjadikan tindakan pengawal saya terlalu "positif badan" dan terasa seperti sesuatu yang boleh dilaksanakan dengan cara yang lebih elegan.
Saya tidak dapat mencari apa-apa dalam dokumentasi Symfony 5.4.
Pada masa ini saya ingin tahu jika:
Kod titik akhir penuh:
/** * @Route("/property", name="property_new", methods={"POST"}) */ public function create(ManagerRegistry $doctrine, Request $request, ValidatorInterface $validator): Response { $entityManager = $doctrine->getManager(); $property = new Property(); $property->setName($request->request->get('name')); $property->setCanBeShared((bool)$request->request->get('can_be_shared')); $parentPropertyIds = (array)$request->request->get('parent_property_ids'); if ($parentPropertyIds) { $parentCount = $doctrine ->getRepository(Property::class) ->countByIds($parentPropertyIds); if ($parentCount !== count($parentPropertyIds)) { return $this->json([ 'status' => 'error', 'message' => 'parent_property_id_invalid' ], 422); } foreach ($parentPropertyIds as $parentPropertyId) { $parentProperty = $doctrine->getRepository(Property::class)->find($parentPropertyId); $property->addParent($parentProperty); } } $errors = $validator->validate($property); if (count($errors) > 0) { $messages = []; foreach ($errors as $violation) { $messages[$violation->getPropertyPath()][] = $violation->getMessage(); } return $this->json([ 'status' => 'error', 'messages' => $messages ], 422); } $entityManager->persist($property); $entityManager->flush(); return $this->json([ 'status' => 'ok', 'id' => $property->getId() ]); }
Anda boleh menggabungkan Objek Pemindahan Data (DTO) dengan perkhidmatan Pengesahan. Terdapat banyak kekangan yang dipratentukan, atau anda boleh membuat kekangan tersuai.
Sebagai contoh, cara menggunakan kekangan mudah sebagai anotasi:
Kemudian tetapkan data kepada DTO:
Dalam beberapa kes adalah lebih baik untuk mentakrifkan pembina dalam DTO dan kemudian meminta daripada dan menghantarnya kepada DTO dengan segera:
Kemudian sahkannya: