Symfony NotBlank 约束允许空字符串

Symfony NotBlank constraint allow blank string

我正在与 Symfony5ApiPlatform 以及 phpunit 一起进行测试

我正在 运行 进行现场验证测试。

我的问题来自于我想限制用户在名为 name 的 属性 中输入空白字符串的可能性,如下所示:

/**
 * @ApiResource(
 *     attributes={
 *          "normalization_context"={"groups"={"cons:read", "cons:list"}},
 *          "denormalization_context"={"groups"={"cons:write"}}
 *     },
 *     collectionOperations={
 *          "get"={
 *              "mehtod"="GET",
 *              "normalization_context"={"groups"={"cons:list"}},
 *          },
 *          "post"={
 *              "method"="POST"
 *              "normalizationContext"={"groups"={"cons:write"}},
 *              "validationGroups"={"create"}
 *          }
 *     }
 * )
 * @ORM\Entity(repositoryClass=ConsultationTypeRepository::class)
 */
class ClassName
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     * @Groups({"cons:read", "cons:list", "some:read", "thing:read"})
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255, nullable=false)
     * @Groups({"cons:read", "cons:write", "cons:list", "some:read", "thing:read", "availability:read"})
     * @Assert\NotBlank (
     *     groups={"create"},
     *     message="Le nom ne peut pas être vide."
     * )
     * @Assert\Length(
     *     max = 255,
     *     maxMessage = "Le nom ne peut pas excéder 255 charactères",
     *     allowEmptyString = false
     * )
     * @Assert\Regex(
     *     pattern="/\d/",
     *     match=false,
     *     message="Le nom ne peut pas contenir de nombre"
     * )
     */
    private $name;

这是我的测试:

public function testRoleAdminCanNotPostConsultationWithBlankName(): void
    {
        $body = '{ "name": ""}';
        $res = $this->buildPostPutRequest(
            Actions::POST,
            self::TYPE_CONSULTATION_ROUTE,
            $body,
            self::ADMIN_CREDENTIALS
        );
        $this->assertResponseStatusCodeSame(400);
    }

现在我收到 201 而不是预期的 400

而其他有关正则表达式或字符串长度的测试 return 400 符合预期。

我不明白为什么 NotBlank() 似乎没有触发此测试。

有什么想法吗?

我认为这是因为您使用驼峰式而不是蛇形式来声明 post 操作属性。驼峰式大小写只能在 ApiResource 注释的顶层使用。

目前,您只声明了 method 操作。这在这里没用。

  • normalizationContext => normalization_context
  • 验证组 => validation_groups

您还在 GET 操作中声明了 mehtod 属性 而不是 method