Rumah  >  Soal Jawab  >  teks badan

Cara menapis/membersihkan/mengesahkan parameter permintaan dalam operasi Rest API untuk Symfony 5.4

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()
        ]);
    }

P粉617237727P粉617237727280 hari yang lalu488

membalas semua(1)saya akan balas

  • P粉635509719

    P粉6355097192023-12-19 16:22:56

    Anda boleh menggabungkan Objek Pemindahan Data (DTO) dengan perkhidmatan Pengesahan. Terdapat banyak kekangan yang dipratentukan, atau anda boleh membuat kekangan tersuai. < /p>

    Sebagai contoh, cara menggunakan kekangan mudah sebagai anotasi:

    class PropertyDTO {
      /**
       * @Assert\NotBlank
       */
      public string $name = "";
      public bool $shared = false;
    }

    Kemudian tetapkan data kepada DTO:

    $propertyData = new PropertyDTO();
    $propertyData->name = $request->request->get('name');
    ...

    Dalam beberapa kes adalah lebih baik untuk mentakrifkan pembina dalam DTO dan kemudian meminta daripada dan menghantarnya kepada DTO dengan segera:

    $data = $request->getContent(); // or $request->getArray(); depends on your content type
    $propertyData = new PropertyDTO($data);

    Kemudian sahkannya:

    $errors = $validator->validate($propertyData);
    
    if (count($errors) > 0) {
        /*
         * Uses a __toString method on the $errors variable which is a
         * ConstraintViolationList object. This gives us a nice string
         * for debugging.
         */
        $errorsString = (string) $errors;
    
        return $this->json([
                    'status'  => 'error',
                    'message' => 'parent_property_id_invalid'
                ], 422);
    }
    
    //...

    balas
    0
  • Batalbalas