Как сохранить нулевые данные с помощью Api-платформы?

#php #symfony #api-platform.com #symfony-validator

#php #symfony #api-platform.com #symfony-валидатор

Вопрос:

С Symfony 5.1 и платформой Api я не могу эффективно обрабатывать сохранение NULL данных.

Примеры для этой простой сущности :

 class Foo
{
    /**
     * @var string
     *
     * @ORMColumn(type="string")
     * @AssertNotBlank()
     */
    public $name;

    /**
     * @var string
     *
     * @ORMColumn(type="text", nullable=true)
     */
    public $content;
}
 

Пример 1 ( POST запрос) :

 {
  "name": "",
  "content": ""
}
 

Я согласен, это хороший возврат (ConstraintViolationList) :

 {
  "@context": "/api/contexts/ConstraintViolationList",
  ...
  "violations": [
    {
      "propertyPath": "name",
      "message": "This value should not be blank."
    }
  ]
}
 

Пример 2 ( POST запрос) :

 {
  "name": "test",
  "content": ""
}
 

Регистрация в базе данных проходит успешно. В базе данных, для content значения, у меня есть "" . Но я хочу сохранить NULL .

Итак, я понимаю, что платформа Api не знает, как преобразовать пустые данные ( "" ) в NULL данные, как это сделал бы Symfony после отправки пустой формы.

Итак, я снова пробую пример 1, но с NULL данными, чтобы убедиться Asserts , что все еще работает.

 {
  "name": null,
  "content": null
}
 

Это не работает, у меня нет ConstraintViolationList ошибки :

 {
  "@context": "/api/contexts/Error",
  ...
  "hydra:description": "The type of the "name" attribute must be "string", "NULL" given.",
}
 

Итак, как мне обработать нулевые данные, чтобы, если они пустые и обязательные, у меня был список ошибок ( ConstraintViolationList ), но если это необязательно, тогда данные регистрируются как NULL и нет "" ?

Было бы обидно и очень, очень, очень утомительно по-разному управлять отправкой данных в зависимости от того, являются ли они обязательными или нет (иногда отправлять "" , а иногда NULL ).

Комментарии:

1. Вы пробовали @AssertNotBlank(allowNull=true) ? Также: как указал rugolinifr в своем ответе: вы также должны разрешить использование свойств null , поэтому убедитесь, что ваши геттеры / сеттеры поддерживают это. Тот факт, что в нем говорится «нарушение ограничений», означает, что текущая проблема, о которой вы спрашиваете, связана с вашими @Assert ограничениями.

2.P.s — NotBlank validator означает для строкового свойства, что значение может не '' совпадать. Когда вы отправляете "name": null без allowNull=true , требуется непустая строка, отсюда и нарушение вашего ограничения. Это означает, allowNull=true что значение может null содержать или должно содержать строковые символы (но все равно может не быть '' (пустым)).

Ответ №1:

Объявите свое свойство nullable:

 class Foo
{
    /**
     * @var null|string
     *
     * @ORMColumn(type="string")
     * @AssertNotBlank()
     */
    public $name; // php < 7.4 style

    /**
     *
     * @ORMColumn(type="text", nullable=true)
     */
    public ?string $content;  // php >= 7.4 style
}