I am developing a custom module that has a block plugin. When the plugin runs, it sometimes adds or modifies a node. And when I call the save method, I sometimes (randomly) get an error: 
Call to a member function getStorage() on null. 
If no error occurs, the node is saved successfully.
I am using Drupal 10.4.6.

my code that causes random error:

use Drupal\node\Entity\Node;
use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface;

public function InsertNewNode( $type, $name, $props, $active='Y', $idUser = 0 ) {
$result = [];
try {
    $activeNode = ($active == 'Y') ? true : false;
    $currentDateTime  = new DrupalDateTime( 'now', new \DateTimeZone(DateTimeItemInterface::STORAGE_TIMEZONE ) );
    $currentDtime     = $currentDateTime->format(DateTimeItemInterface::DATETIME_STORAGE_FORMAT );
    $requestedTime    = $currentDateTime->getTimestamp();
    if( empty( $idUser ) ) {
        $user = \Drupal::currentUser();
        $idUser = $user->id();
    }
    $nodeStorage = \Drupal::entityTypeManager()->getStorage('node');
    $element = $nodeStorage->create(
      [
        'type' => $type,
        'title' => $name,
        'created' => $requestedTime,
        'changed' => $requestedTime,
        'status' => $activeNode,
        'uid' => $idUser
      ]);
    foreach ($props as $prop => $value) {
      $element->set($prop, $value);
    }
    $element->save();
    $result = [
          'errorCode' => 0,
          'errorMessage' => 'ok',
          'element_id' => $element->id()
        ];
        
  } catch ( \Exception $e ) {
        $result = ['errorCode' => 200, 'errorMessage' => $e->getMessage()];
        $this->logging( $result );
  } catch ( \Error $e ) {
        $result = ['errorCode' => 200, 'errorMessage' => $e->getMessage()];
        $this->logging( $result );
  }

  return( $result );
}

I get a message on the screen:


The website encountered an unexpected error. Try again later.

TypeError: array_replace(): Argument #1 ($array) must be of type array, false given in array_replace() (line 360 of core/lib/Drupal/Core/Entity/EntityFieldManager.php).

Drupal\Core\Entity\EntityFieldManager->getFieldDefinitions('block_content', 'basic') (Line: 417)
Drupal\Core\Entity\EntityDisplayBase->getFieldDefinitions() (Line: 194)
Drupal\Core\Entity\EntityDisplayBase->init() (Line: 155)
Drupal\Core\Entity\EntityDisplayBase->__construct(Array, 'entity_view_display') (Line: 181)
Drupal\Core\Entity\Entity\EntityViewDisplay->__construct(Array, 'entity_view_display') (Line: 48)
Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay->__construct(Array, 'entity_view_display') (Line: 418)
Drupal\Core\Entity\EntityStorageBase->mapFromStorageRecords(Array) (Line: 41)
Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplayStorage->mapFromStorageRecords(Array) (Line: 186)
Drupal\Core\Config\Entity\ConfigEntityStorage->doLoadMultiple(Array) (Line: 312)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 262)
Drupal\Core\Entity\EntityStorageBase->load('block_content.basic.default') (Line: 289)
Drupal\layout_builder\Plugin\SectionStorage\DefaultsSectionStorage->extractEntityFromRoute('block_content.basic.default', Array) (Line: 247)
Drupal\layout_builder\Plugin\SectionStorage\DefaultsSectionStorage->deriveContextsFromRoute('', Array, 'section_storage', Array) (Line: 45)
Drupal\layout_builder\Routing\LayoutSectionStorageParamConverter->convert('', Array, 'section_storage', Array) (Line: 100)
Drupal\Core\ParamConverter\ParamConverterManager->convert(Array) (Line: 90)
Drupal\Core\Access\AccessManager->checkNamedRoute('entity.entity_view_display.block_content.default', Array, Object, 1) (Line: 218)
Drupal\Core\Menu\DefaultMenuLinkTreeManipulators->menuLinkCheckAccess(Object) (Line: 107)
Drupal\Core\Menu\DefaultMenuLinkTreeManipulators->checkAccess(Array) (Line: 111)
Drupal\Core\Menu\DefaultMenuLinkTreeManipulators->checkAccess(Array) (Line: 111)
Drupal\Core\Menu\DefaultMenuLinkTreeManipulators->checkAccess(Array) (Line: 111)
Drupal\Core\Menu\DefaultMenuLinkTreeManipulators->checkAccess(Array)
call_user_func(Array, Array) (Line: 153)
Drupal\Core\Menu\MenuLinkTree->transform(Array, Array) (Line: 47)
Drupal\admin_toolbar\Render\Element\AdminToolbar::preRenderTray(Array)
call_user_func_array(Array, Array) (Line: 113)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 875)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 432)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 504)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 504)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 248)
Drupal\Core\Render\Renderer->render(Array) (Line: 94)
template_preprocess_toolbar(Array, 'toolbar', Array)
call_user_func_array('template_preprocess_toolbar', Array) (Line: 261)
Drupal\Core\Theme\ThemeManager->render('toolbar', Array) (Line: 491)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 504)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 248)
Drupal\Core\Render\Renderer->render(Array) (Line: 484)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 85)
__TwigTemplate_4a5a6dd7ab7b16cdab5b9bc9394f730c->doDisplay(Array, Array) (Line: 388)
Twig\Template->yield(Array, Array) (Line: 344)
Twig\Template->display(Array) (Line: 359)
Twig\Template->render(Array) (Line: 51)
Twig\TemplateWrapper->render(Array) (Line: 33)
twig_render_template('themes/custom/otp_barrio_b5/templates/layout/html.html.twig', Array) (Line: 348)
Drupal\Core\Theme\ThemeManager->render('html', Array) (Line: 491)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 248)
Drupal\Core\Render\Renderer->render(Array) (Line: 158)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 638)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 153)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 111)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 186)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 76)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 53)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 28)
Drupal\Core\StackMiddleware\ContentLength->handle(Object, 1, 1) (Line: 32)
Drupal\big_pipe\StackMiddleware\ContentLength->handle(Object, 1, 1) (Line: 116)
Drupal\page_cache\StackMiddleware\PageCache->pass(Object, 1, 1) (Line: 90)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 36)
Drupal\Core\StackMiddleware\AjaxPageState->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\StackedHttpKernel->handle(Object, 1, 1) (Line: 741)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
 


what am i doing wrong?

Thank you!

Comments

jaypan’s picture

I'm thinking your problem probably lies with this:

    foreach ($props as $prop => $value) {
      $element->set($prop, $value);
    }
    $element->save();

I'm thinking that it's sometimes passing a value that is not in the correct format. I would try to find a way to replicate the issue, then throw a debugger on the set() line, examining $prop and $value for each iteration to see if something stands out.

Contact me to contract me for D7 -> D10/11 migrations.

alexandremush’s picture

field_code100 type: string, before set:

empty

after set:
[
{
"value": "banner"
}
]
field_sorting type: integer, before set:
[
{
"value": 0
}
]
after set:
[
{
"value": 1
}
]
field_postindex5 type: string, before set:
empty

after set:
[
{
"value": "Y"
}
]
field_postindex6 type: string, before set:
empty

after set:
[
{
"value": "cute"
}
]
field_age type: integer, before set:
empty

after set:
[
{
"value": 3
}
]
field_codefolder type: string, before set:
empty

after set:
[
{
"value": "dd.mm.yyyy"
}
]
field_actionstart type: datetime, before set:
empty

after set:
[
{
"value": "2025-04-15T16:19:32"
}
]
field_actionstartreal type: datetime, before set:
empty

after set:
[
{
"value": "2025-04-15T16:19:32"
}
]
field_agentstartdate type: datetime, before set:
empty

after set:
[
{
"value": "2025-04-15"
}
]
Save fields...

InsertNewNode Error:
{
"errorCode": 200,
"errorMessage": "Call to a member function getStorage() on null"
}

Data is simple.
format matches types. or does not match?
 

jaypan’s picture

Nothing stands out to me. If you remove the chunk of code I identified earlier, do you still get the error? I may have misdiagnosed.

Contact me to contract me for D7 -> D10/11 migrations.

alexandremush’s picture

I removed the entire piece of code that you highlighted:

    foreach ($props as $prop => $value) {
      $element->set($prop, $value);
    }
    $element->save();

 I did 10 checks. There was no error even once.

But without calling the "save" method, the node was not added. Then I returned the "save" method and the error returned again! But on the third attempt, saving occurred and the node was added.

I did everything as described here: How Can I Create Node Drupal 9.x?

I finally removed everything I could. I left only creating a node and saving:

try {
$nodeStorage = \Drupal::entityTypeManager()->getStorage('node');
$element =   $nodeStorage->create(
          [
            'type' => $type
//          'title' => $name,
//          'created' => $requestedTime,
//          'changed' => $requestedTime,
//          'uid' => $idUser,
//          'status' => $activeNode
          ]);
$element->set( 'title', $name );
$element->save();
} catch(  \Error $e ) {
...
}

That didn't help either.

alexandremush’s picture

Topic closed. I found the reason for this behavior of the "save" method. For the local site settings (development site) I used the file: settings.local.php. After I disabled this file from my site configuration, the "random error" no longer appears!