Score:1

Why am I getting different results for entity::save() between REST and web?

cn flag

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
my flag
Have you put xdebug on this or have you verified via Storm / IDE that all of the types are correct? What type is `$this` coming in as? I think you have one of two problem. (1) User vs Account object or (2) String vs DateTimeZone problem. I am on wrong computer, but I don't think you need the explicit `timezone_open ` calls. I think proper `DateTimeZone` objects are always passed around in the API.
mangohost

Post an answer

Most people don’t grasp that asking a lot of questions unlocks learning and improves interpersonal bonding. In Alison’s studies, for example, though people could accurately recall how many questions had been asked in their conversations, they didn’t intuit the link between questions and liking. Across four studies, in which participants were engaged in conversations themselves or read transcripts of others’ conversations, people tended not to realize that question asking would influence—or had influenced—the level of amity between the conversationalists.