问题描述
您好,我正在尝试验证用户实体验证,但是只有一个属性与PATCH请求一起使用,但是我却得到了Cannot validate values of type \"NULL\" automatically. Please provide a constraint.
即使从validation_groups中删除默认值,我也得到相同的结果
非常感谢您的帮助。
App \ Entity \ User
/**
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @ApiResource(
* itemOperations={
* "get",* "put" = {
* "method" = "PUT",* "security"="(is_granted('ROLE_ADMIN') and object.getAssociation() == user.getAssociation())",* "security_message"="Only Admin or the owner can edit this field",* "denormalization_context"={"groups"={"user:update"},"disable_type_enforcement"=true},* "validation_groups"={"Default","user_update"}
* },* "patch_add_new_member_to_pay" = {
* "method" = "PATCH",* "path" = "/users/{id}/addNewMemberToPay",* "controller" = PayingMembershipForOthersController::class,* "denormalization_context" = {"groups" = {"add_new_member_to_pay"}},* "validation_groups" = {"Default","add_new_member_to_pay"}
* }
* },* collectionoperations={
* "get",* "post" = {
* "method" = "POST",* "security"="is_granted('ROLE_ADMIN')",* "denormalization_context"={"groups"={"user:create"},* "validation_groups"={"Default","user_create"}
* },* },* normalizationContext={"groups"={"user:read"}}
* )
*/
class User {
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*
* @Groups({"user:read"})
*/
private ?int $id = null;
/**
* @ORM\Column(type="string",length=100)
* @Assert\NotBlank(groups={"user_create","user_update"})
* @Assert\Regex(pattern="/\d/",match=false,message="Your name should not contain numbers")
* @Groups({"user:read","user:create","user:update"})
*/
private ?string $fullname;
/**
* @Groups({"add_new_member_to_pay"})
* @Assert\NotNull(groups={"add_new_member_to_pay"})
*/
private ?string $payForNewMember = null;
...getters and setters
}
App \ Controller \ PayingMembershipForOthersController
namespace App\Controller;
use ApiPlatform\Core\Validator\ValidatorInterface;
use App\Entity\User;
use Symfony\Component\HttpFoundation\Request;
class PayingMembershipForOthersController
{
private ValidatorInterface $validator;
public function __construct(ValidatorInterface $validator)
{
$this->validator = $validator;
}
public function __invoke(User $data,Request $request)
{
$this->validator->validate($data);
}
}
因此,我故意将空值{"payForNewMember": ""}
设置为不显示违规列表
解决方法
您的自定义控制器必须返回用户或响应。
class PayingMembershipForOthersController
{
private ValidatorInterface $validator;
public function __construct(ValidatorInterface $validator)
{
$this->validator = $validator;
}
public function __invoke(User $data)
{
$this->validator->validate($data);
return $data;
}
}