- Issue created by @Rob230
- π¬π§United Kingdom Rob230
It looks like the problem is this function:
public function setRecursiveRenderProtection(array $build): array { // Checks whether entity render array with matching cache keys is being // recursively rendered. If not already being rendered, add an entry to track // that it is. $recursion_key = implode(':', $build['#cache']['keys'] ?? []); if (isset($this->recursionKeys[$recursion_key])) { $this->getLogger('entity') ->error('Recursive rendering attempt aborted for %key. In progress: %guards', [ '%key' => $recursion_key, '%guards' => print_r($this->recursionKeys, TRUE), ]); $build['#printed'] = TRUE; } else { $this->recursionKeys[$recursion_key] = $recursion_key; } return $build; }
For paragraph entities,
$build['#cache']['keys']
is empty, so$recursion_key
is an empty string. This empty string then matches for every paragraph so they don't render.From my investigations the reason why the keys array is empty for paragraphs is because of this code (also in EntityViewBuilder.php):
if ($this->isViewModeCacheable($view_mode) && !$entity->isNew() && $entity->isDefaultRevision() && $this->entityType->isRenderCacheable()) { $build['#cache'] += [ 'keys' => [ 'entity_view', $this->entityTypeId, $entity->id(), $view_mode, ], 'bin' => $this->cacheBin, ];
$this->entityType->isRenderCacheable() is FALSE for paragraphs because the Paragraph entity has
render_cache = FALSE
in its definition.Simply checking if $recursion_key is a blank fixes this problem.
- π¬π§United Kingdom Rob230
I don't know if I'm missing something here, but regardless of the reason there are no cache keys, surely a blank key should never be used to detect recursion. This patch shows the way I fixed it.
Many sites are using paragraphs in Drupal 10 without this problem. Can we figure out the actual steps to reproduce? I assume the paragraphs are nested or something...
- π¬π§United Kingdom Rob230
It is affecting every paragraph, regardless of nesting, due to the problem I described (keys always being empty for paragraphs).
If it's not affecting other sites then I suppose there must be some other reason that the
$build['#cache']['keys']
array is empty on my site, but I couldn't find one. I searched the code for anything mentioning the cache. Not sure what else to look for.Do you know if my change would break anything? I can't see why it makes sense to try to detect recursion without any identifier. The only other way to fix this would be to stop $build['#cache']['keys'] from being empty but so far I couldn't figure out why that's the case - it looked intentional when I stepped through the code, maybe I need to dig deeper to see if it gets set later on and then removed.
Drupal 10 was released almost one year ago and I can assert that paragraphs are not in general broken in Drupal 10. If there are serious paragraphs bugs they would be listed here: https://www.drupal.org/project/issues/paragraphs?text=&status=Open&prior... β
- Status changed to Postponed: needs info
about 1 year ago 9:42pm 7 November 2023 Hold on, core/lib/Drupal/Core/Entity/EntityViewBuilder.php doesn't even have as many lines as your patch suggests it does, and it doesn't have the comments I see in the patch context. Is the file patched already? What is the exact Drupal version? That isn't the core/lib/Drupal/Core/Entity/EntityViewBuilder.php file from 10.1.6.
I am sending the patch for testing to see that it does not apply.
- last update
about 1 year ago Patch Failed to Apply - πΊπΈUnited States jeffschuler Boulder, Colorado
Experiencing this too. I think it started when we began using the patch/MR in π Can only intentionally re-render an entity with references 20 times Needs work to address that issue. Rob230: using that patch too?
- Status changed to Closed: duplicate
about 1 year ago 2:58pm 15 November 2023 - π¬π§United Kingdom Rob230
jeffschuler, yes we are using the merge request 4994 from that issue. Thanks for flagging this, I'll continue investigations in the other thread.