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

时间:2016-03-29 12:44:59

标签: php symfony fosrestbundle

我的Dns实体的content字段带有NotBlank约束

/**
 * @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);
}

当我尝试更新Dns条目而不更改content字段时,由于NotBlank约束,我收到以下错误。

  

{     "错误":" validation_failed",     " error_description":"数据验证失败。请检查以下错误。",     " validation_errors":{       "内容":[         "此值不能为空。"       ]     }   }

这与NotNull约束相同。

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

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

1 个答案:

答案 0 :(得分:1)

您可以处理validation groups以保持对INSERT的约束,并在UPDATE上跳过它。

示例:

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

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

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

有关详情,请参阅Request body listener