Cara menapis/membersihkan/mengesahkan parameter permintaan dalam operasi Rest API untuk Symfony 5.4
P粉617237727
P粉617237727 2023-12-18 18:58:41
0
1
519

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:

  • Pastikan ini adalah array;
  • Pastikan ID dalam tatasusunan benar-benar merujuk kepada rekod pangkalan data;

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:

  • Terdapat cara untuk menapis/membersihkan parameter permintaan dalam Symfony;
  • Terdapat cara terbina dalam yang elegan untuk menggunakan kekangan pengesah tersuai untuk meminta parameter (serupa dengan pengesahan medan entiti yang didokumentasikan dengan baik
  • ).

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粉617237727
P粉617237727

membalas semua(1)
P粉635509719

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:

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

//...
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan