Действие FosRestBundle PATCH + поле объекта с ограничением NotBlank

У меня есть объект 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;

Я выполнил рабочее действие PATCH с FosRestBundle.

/**
 * @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.

{ "error": "validation_failed", "error_description": "Проверка данных не удалась. Проверьте ошибки ниже.", "validation_errors": { "content": [ "Это значение не может быть нулевым." ] } }

То же самое делается с ограничением NotNull.

Я пытаюсь ИСПРАВИТЬ запись Dns, не меняя поле content.

Возможно ли сохранить мое ограничение внутри объекта или я должен использовать другой способ?


person Jérôme    schedule 29.03.2016    source источник


Ответы (1)


Вы можете работать с группами проверки, чтобы сохранить ограничение на 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"}}})
 */

Дополнительную информацию см. в прослушивателе тела запроса.

person chalasr    schedule 29.03.2016