#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
}