ideneal / request-content-converter-bundle
此包提供了一种指定格式转换和验证请求内容的方法
Requires
- php: >=7.1.3
- doctrine/annotations: ^1.0
- sensio/framework-extra-bundle: ^5.5
- symfony/config: ^4.4|^5.0
- symfony/dependency-injection: ^4.4|^5.0
- symfony/expression-language: *
- symfony/framework-bundle: ^4.4|^5.0
- symfony/http-kernel: ^4.4|^5.0
- symfony/orm-pack: *
- symfony/serializer-pack: *
- symfony/validator: *
Requires (Dev)
- phpunit/phpunit: ^7
- symfony/phpunit-bridge: ^4.3.5|^5.0
This package is auto-updated.
Last update: 2024-08-29 05:24:58 UTC
README
这是一个扩展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属性并验证它。
您也可以使用Json
和Xml
,而不是设置格式,而不使用ContentParamConverter。
EntityContentParamConverter
为了将请求内容映射到Doctrine实体,您可以使用EntityContentParamConverter。您也可以使用指定格式的JsonEntity
和XmlEntity
。
让我们看看一个用例,您必须更新数据库中的产品。所以您有一个实体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
默认情况下,将检查所选类中所有约束是否有效,无论它们是否实际通过。然而,在某些情况下,您可能需要仅针对该类的一些约束验证对象。为此,您可以将每个约束组织到一个或多个“验证组”中,然后仅对一组约束应用验证。