【问题标题】:Custom controller validation is not working Api-platform自定义控制器验证不起作用 Api 平台
【发布时间】:2021-01-25 14:53:36
【问题描述】:

您好,我正在尝试验证用户实体验证,但只有一个带有 PATCH 请求的属性,但我收到了Cannot validate values of type \"NULL\" automatically. Please provide a constraint.

即使我从 validation_groups 中删除 Default,我也会得到相同的结果

非常感谢您的帮助。

应用\实体\用户

     /**
         * @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"}, "disable_type_enforcement"=true},
         *               "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": ""}验证不显示违规列表

【问题讨论】:

    标签: php api symfony validation api-platform.com


    【解决方案1】:

    您的自定义控制器必须返回用户或响应。

    class PayingMembershipForOthersController
    {
    
        private ValidatorInterface $validator;
    
        public function __construct(ValidatorInterface $validator)
        {
            $this->validator = $validator;
        }
    
        public function __invoke(User $data)
        {
            $this->validator->validate($data);
            return $data;
        }
    
    }
    

    【讨论】:

    • 我们可以返回状态 204(空响应)吗?
    • 我认为你只需要在你的 api 实体/资源上将“read”参数设置为 false
    猜你喜欢
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多