Я рефакторинг своих пользовательских объектов для использования классы пакетов сущностей.
Раньше я сохранял значение смещения времени в поле, используя hook_user_presave()
:
// Инициализация в часовом поясе пользователя.
$user_timezone = timezone_open($this->getTimeZone());
$time_to_convert = новый \DateTime('сейчас', $user_timezone);
// Установить предпочтительное время пользователя.
$time_to_convert->setTime($часы,$минуты);
// Преобразование в часовой пояс сайта по умолчанию.
$time_to_convert->setTimezone(timezone_open('Где-то/Где-то'));
$converted_time = $time_to_convert->format('Привет');
$this->set('field_converted_time', $converted_time);
Это отлично работало для регистрации как через веб-сайт Drupal, так и через мое веб-приложение Ionic React (которое в основном использует JSON: API, но использует ресурс REST для регистрации пользователей.
Затем я переместил приведенный выше код в публичная функция save()
в моем классе пакетов пользовательских объектов.
Когда я это сделал, регистрация пользователя на веб-сайте продолжает работать нормально, но при разделенной регистрации возникает следующая ошибка:
TypeError: DateTime::__construct(): Аргумент №2 ($timezone) должен иметь тип ?DateTimeZone, bool, заданный в DateTime->__construct().
Проблема в том, что $this->getTimeZone()
не возвращает значение в несвязанном сценарии, но почему? Я думал, что регистрация через REST будет точно такой же, как и при регистрации через веб-сайт — примерно так, как hook_user_presave()
выполняется так же.
Вот YAML для моей конечной точки регистрации пользователя:
UUID: отредактировано
код языка: en
статус: правда
зависимости:
модуль:
- сериализация
- пользователь
идентификатор: user_registration
plugin_id: user_registration
гранулярность: ресурс
конфигурация:
методы:
- ПУБЛИКОВАТЬ
форматы:
- json
аутентификация:
- печенье