Исключение времени выполнения сериализатора JMS для выдачи кода состояния 400

Я использую сериализатор JMS и имею два поля: вход и выход в виде даты и времени с определенным форматом, например:

/**
 * @var \DateTime
 * @Type("DateTime<'Y-m-d'>")
 * @Assert\Date()
 */
 protected $checkin;

/**
 * @var \DateTime
 * @Type("DateTime<'Y-m-d'>")
 * @Assert\Date()
 */
 protected $checkout;

Теперь я хочу выдать код состояния HTTP 400, если, например, кто-то отправляет недопустимый формат (например, пустую строку).

Проблема в том, что JMS Serializer выдает RuntimeException, когда не может создать дату и время из формата в DateHandler, например:

if (false === $datetime) {
    throw new RuntimeException(sprintf('Invalid datetime "%s", expected format %s.', $data, $format));
}

Это исключение дает код состояния HTTP 500.

Также проверил возможность добавить код исключения 400 в конфигурацию для этого экземпляра, но проблема в том, что JMS выдает этот тип исключения в широком диапазоне различных ситуаций.

Заранее спасибо!


person foxtrot    schedule 02.09.2015    source источник


Ответы (1)


Это похоже на ситуацию, когда вы должны использовать что-то вроде json-schema (реализация PHP), чтобы проверить отправленный пользователем JSON, а не полагаться на JMS Serializer, который, как следует из названия, предназначен исключительно для де/сериализации контента. а не подтверждать его.

В качестве временного промежутка вы можете попробовать/уловить десериализацию, а затем вручную вернуть ответ 400, например.

try {
    $deserialized = $serializer->deserialize($content, My\Class, 'json');
} catch (\Exception $e) {
    return new Response($e->getMessage(), 400);
}

Хотя это решило бы вашу непосредственную проблему, на самом деле это не лучший путь кода. В вашем примере Symfony перехватывает само исключение (поскольку оно не перехватывается вашим кодом) и переводит это в ответ 500, сам сериализатор JMS не может вернуть ответ 400.

person John Noel    schedule 02.09.2015
comment
Хорошая точка зрения. Использовать json-схему для проверки перед десериализацией контента. Спасибо. - person foxtrot; 03.09.2015