ideneal/request-content-converter-bundle

此包提供了一种指定格式转换和验证请求内容的方法

v1.1.0 2021-01-30 17:29 UTC

This package is auto-updated.

Last update: 2024-08-29 05:24:58 UTC


README

Packagist GitHub license Travis branch Codacy branch

这是一个扩展SensioFrameworkExtraBundle功能的Symfony包。它提供了一种将请求内容反序列化并验证到指定类或实体中的方法。

安装

将包添加到您的composer.json文件中

composer require ideneal/request-content-converter-bundle

用法

ContentParamConverter

ContentParamConverter允许您将请求内容转换为特定的控制器操作参数。

让我们看看一个简单的用例,您想订阅一个潜在客户。创建一个简单的Lead类

namespace App\Inputs;

use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Serializer\Annotation\Groups;

class Lead
{
    /**
     * @Assert\Type("string")
     * @Assert\NotBlank
     */
    private $name;

    /**
     * @Assert\Email(groups={"strict"})
     * @Groups("registration")
     */
    private $email;

    public function setName($name)
    {
        $this->name = $name;
    }
    
    public function getName()
    {
        return $this->name;
    }

    public function setEmail($email)
    {
        $this->email = $email;
    }

    public function getEmail()
    {
        return $this->email;
    }
}

在控制器中创建一个简单的操作并添加ContentParamConverter注解,指定请求格式

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Ideneal\Bundle\RequestContentConverterBundle\Configuration\ContentParamConverter;
use App\Inputs\Lead;

class SubscribeController extends AbstractController
{
    /**
     * @Route("/subscribe", name="subscribe")
     * @ContentParamConverter("lead", methods={"POST"}, format="json")
     */
    public function subscribe(Lead $lead)
    {
        /* Do some operations .... */
         
        dump($lead);
        return new JsonResponse(['message' => 'ok']);
    }
}

在这种情况下,ContentParamConverter注解自动将请求内容JSON键映射到相关的Lead属性并验证它。

您也可以使用JsonXml,而不是设置格式,而不使用ContentParamConverter。

EntityContentParamConverter

为了将请求内容映射到Doctrine实体,您可以使用EntityContentParamConverter。您也可以使用指定格式的JsonEntityXmlEntity

让我们看看一个用例,您必须更新数据库中的产品。所以您有一个实体Product

namespace App\Entity;

use App\Repository\ProductRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity(repositoryClass=ProductRepository::class)
 */
class Product
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\Length(min=3)
     */
    private $name;

    /**
     * @ORM\Column(type="integer")
     * @Assert\Positive
     */
    private $price;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function getPrice(): ?int
    {
        return $this->price;
    }

    public function setPrice(int $price): self
    {
        $this->price = $price;

        return $this;
    }
}

为了更新特定的Product,您可以创建以下操作

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Ideneal\Bundle\RequestContentConverterBundle\Configuration\JsonEntity;
use App\Entity\Product;

class ApiController extends AbstractController
{
    /**
     * @Route("/api/products/{id}", name="update_product", methods={"PUT"})
     * @JsonEntity("product", class="App\Entity\Product")
     */
    public function update(Product $product)
    {
        /* Do some operations... */

        dump($product);
        $em = $this->getDoctrine()->getManager();
        $em->flush();
        
        return new JsonResponse(['message' => 'ok']);
    }
}

在控制器操作中,$product已经被json请求更新和验证。

注解选项

除了format参数外,您还可以设置其他选项。

groups

有时,您想从所选类中反序列化不同集合的属性。组是满足这一需求的有用方式。

groups键的值可以是一个字符串,也可以是一个字符串数组。

validate

默认为true。如果为false,则禁用验证。

validation_groups

默认情况下,将检查所选类中所有约束是否有效,无论它们是否实际通过。然而,在某些情况下,您可能需要仅针对该类的一些约束验证对象。为此,您可以将每个约束组织到一个或多个“验证组”中,然后仅对一组约束应用验证。