Symfony NotBlank 约束允许空字符串
Symfony NotBlank constraint allow blank string
我正在与 Symfony5
和 ApiPlatform
以及 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
。
我正在与 Symfony5
和 ApiPlatform
以及 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
。