I’m refactoring my user entities to use entity bundle classes.
Before, I saved the value of a time offset in a field using hook_user_presave()
:
// Initialize in user timezone. $user_timezone = timezone_open($this->getTimeZone()); $time_to_convert = new DateTime('now', $user_timezone); // Set the user's preferred time. $time_to_convert->setTime($hours, $minutes); // Convert to the site's default timezone. $time_to_convert->setTimezone(timezone_open('Somewhere/Someplace')); $converted_time = $time_to_convert->format('Hi'); $this->set('field_converted_time', $converted_time);
This worked fine for registration both via the Drupal website and my Ionic React webapp (which mainly uses JSON:API, but uses the REST resource for user registration.
I then moved the above code to public function save()
in my user entity bundle class.
When I did so, website user registration continues to work fine, but decoupled registration has the following error:
TypeError: DateTime::__construct(): Argument #2 ($timezone) must be of type ?DateTimeZone, bool given in DateTime->__construct().
The problem is that $this->getTimeZone()
does not return a value in the decoupled scenario, but why? I thought that registration via REST would be exactly the same as when registering via the website– just like how hook_user_presave()
gets executed the same way.
Here’s the YAML for my user registration endpoint:
uuid: redacted langcode: en status: true dependencies: module: - serialization - user id: user_registration plugin_id: user_registration granularity: resource configuration: methods: - POST formats: - json authentication: - cookie