Tempahan model.php
<?php namespace App\Dto\Request\Model; use Symfony\Component\Validator\Constraints as Assert; class OrderModel { #[Assert\Uuid(message: "Order id must be an unique identifier value.")] #[Assert\Positive(message: "Order id must be a positive integer value.")] public int $id; /** * @Assert\Positive(message="customerId must be a positive integer value.") */ public int $customerId; public array $items; /** * @Assert\Type("string", message="Order total must be a string float value.") * @Assert\Type("float", message="Order total must be a string float value.") */ public string $total; }
Jenis pesanan.php
<?php use App\Dto\Request\Model\OrderModel; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\CollectionType; use Symfony\Component\Form\Extension\Core\Type\IntegerType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; class OrderType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('id', IntegerType::class) ->add('customerId', IntegerType::class) ->add('items', CollectionType::class, [ 'entry_type' => ItemType::class ]) ->add('total', TextType::class); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ 'data_class' => OrderModel::class ]); } }
OrderController.php:
#[Route('/order', name:'order_new', methods: 'POST')] public function create(ManagerRegistry $doctrine, Request $request): JsonResponse|Response { $form = $this->createForm(\OrderType::class); if ($request->isMethod('POST')) { $form->submit($request->request->get($form->getName())); if(!$form->isSubmitted() || !$form->isValid()){ return $this->handleView($this->view($form, Response::HTTP_BAD_REQUEST)); } } }
Permintaan pos saya:
{ "id": "dsdas", "customerId": 1, "items": [ { "productId": 1, "quantity": 1, "unitPrice": "250.25", "total": "250.25" }, { "productId": 1, "quantity": 1, "unitPrice": "250.25", "total": "250.25" } ], "total": "500.50" }
Permintaan ini sedang disahkan dan saya cuba memikirkannya. Sebarang idea akan sangat dihargai.
Saya rasa anda kehilangan nama borang sebagai kunci peringkat teratas dalam data yang diserahkan. Anda cuba menghantar ini:
Kod anda ($request->request->get($form->getName())) menjangkakan ini (jika nama borang ialah "order_type")
Satu penyelesaian adalah dengan membuat borang bernama...tanpa nama :)
Penyelesaian kedua ialah tambah nama borang sendiri
Pilihan ketiga (tetapi bukan yang terbaik) ialah anda sentiasa menghantar data kepada pengawal bersama-sama dengan kunci borang, tetapi saya tidak akan memilih pilihan ini jika ia adalah titik akhir API. Jadi hanya jika ia adalah penyerahan borang biasa dan medan borang yang diserahkan semuanya dijana dengan awalan nama borang asal.
Sebagai pilihan terakhir, anda juga boleh menangkap data masuk dalam kedua-dua format. Mungkin sesuatu seperti ini dan anda sebenarnya boleh menghantar dengan atau tanpa kunci: