FosRestBundle PATCH操作+具有NotBlank约束的实体字段


FosRestBundle PATCH action + entity field with NotBlank constraint

我有一个Dns实体,它有一个带有NotBlank约束的content字段

/**
 * @var int
 *
 * @ORM'Column(name="id", type="integer", nullable=false)
 * @ORM'Id
 * @ORM'GeneratedValue(strategy="IDENTITY")
 */
private $id;
/**
 * @var string
 *
 * @ORM'Column(name="name", type="string", length=255, nullable=true)
 * @Assert'Regex("/^(([[:alnum:]-_]+('.[[:alnum:]-_]+)*)|('*))$/u")
 */
private $name;
/**
 * @var string
 *
 * @ORM'Column(name="content", type="string", length=64000, nullable=true)
 * @Assert'NotBlank
 * @Assert'Length(max="64000")
 */
private $content;

我用FosRestBundle 做了一个工作PATCH动作

/**
 * @ParamConverter("updatedRecord", converter="fos_rest.request_body")
 */
public function patchAction(PowerDNSDomain $domain, PowerDNSRecord $record, PowerDNSRecord $updatedRecord, ConstraintViolationListInterface $validationErrors)
{
    if ($validationErrors->count() > 0) {
        return $this->handleBodyValidationErrorsView($validationErrors);
    }
    $record->setName($updatedRecord->getName())
           ->setContent($updatedRecord->getContent())
           ->setTtl($updatedRecord->getTtl())
           ->setPrio($updatedRecord->getPrio());
    $this->get('manager.dns')->saveRecord($record);
    return $this->view($record);
}

当我试图在不更改content字段的情况下更新Dns条目时,由于我的NotBlank约束,我会出现以下错误。

{"error":"validation_failed","errordescription":"数据验证失败。请检查下面的错误。","validation_errors":{"内容":["此值不能为null。"]}}

这与NotNull约束相同。

我正在尝试在不更改content字段的情况下修补Dns条目。

这是否可以将我的约束保留在实体中,或者我必须使用另一种方式?

您可以处理验证组,以保留对INSERT的约束,并跳过对UPDATE的约束。

示例:

/**
 * @var string
 *
 * @ORM'Column(name="content", type="string", length=64000, nullable=true)
 * @Assert'NotBlank(groups={"new"})
 * @Assert'Length(max="64000")
 */
private $content;

然后,如果您的方法正在创建一个新条目,请在@ParamConverter注释中设置new验证组:

/**
 * @ParamConverter("updatedRecord", converter="fos_rest.request_body", options={"validator"={"groups"={"new"}}})
 */

有关更多信息,请参阅请求正文侦听器。