自定义控制器验证无法在Api平台上运行

问题描述

您好,我正在尝试验证用户实体验证,但是只有一个属性与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;
    }

}