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
I'm thinking your problem
I'm thinking your problem probably lies with this:
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.
inserted debugging before filling the field and after filling it
field_code100 type: string, before set:emptyafter 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?
Nothing stands out to me. If
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.
I removed the entire piece of code that you highlighted
I removed the entire piece of code that you highlighted:
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:
That didn't help either.
Topic closed.
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!