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