From 4f5fd55f1f0705ff8aaf90352cfcfeac60116e55 Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Sun, 27 Oct 2024 21:06:12 +0100 Subject: [PATCH 1/3] TASK: Catchups will only be able to access the state of the projection they are registered for A catchup doesn't have access to the full content repository, as it would allow full recursion via handle and accessing other projections state is not safe as the other projection might not be behind - the order is undefined. This will make it possible to catchup projections from outside of the cr instance as proposed here: https://github.com/neos/neos-development-collection/pull/5321 --- .../RaceTrackerCatchUpHookFactory.php | 7 +++-- .../Classes/ContentRepository.php | 2 +- .../ProjectionsAndCatchUpHooksFactory.php | 6 ++--- .../Projection/CatchUpHookFactories.php | 16 +++++++++--- .../CatchUpHookFactoryInterface.php | 13 ++++++++-- .../ContentGraphReadModelInterface.php | 6 ++++- .../Projection/ProjectionsAndCatchUpHooks.php | 1 + ...ushSubgraphCachePoolCatchUpHookFactory.php | 8 ++++-- .../CatchUpHook/AssetUsageCatchUpHook.php | 24 +++++++++-------- .../AssetUsageCatchUpHookFactory.php | 12 ++++++--- .../CatchUpHook/RouterCacheHook.php | 18 +++++-------- .../CatchUpHook/RouterCacheHookFactory.php | 12 ++++++--- ...phProjectorCatchUpHookForCacheFlushing.php | 26 ++++++++++--------- ...ctorCatchUpHookForCacheFlushingFactory.php | 12 ++++++--- 14 files changed, 103 insertions(+), 60 deletions(-) diff --git a/Neos.ContentRepository.BehavioralTests/Classes/ProjectionRaceConditionTester/RaceTrackerCatchUpHookFactory.php b/Neos.ContentRepository.BehavioralTests/Classes/ProjectionRaceConditionTester/RaceTrackerCatchUpHookFactory.php index 30467e9dd48..c123247b704 100644 --- a/Neos.ContentRepository.BehavioralTests/Classes/ProjectionRaceConditionTester/RaceTrackerCatchUpHookFactory.php +++ b/Neos.ContentRepository.BehavioralTests/Classes/ProjectionRaceConditionTester/RaceTrackerCatchUpHookFactory.php @@ -14,18 +14,21 @@ namespace Neos\ContentRepository\BehavioralTests\ProjectionRaceConditionTester; -use Neos\ContentRepository\Core\ContentRepository; use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryInterface; use Neos\ContentRepository\Core\Projection\CatchUpHookInterface; +use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphReadModelInterface; +use Neos\ContentRepository\Core\Projection\ProjectionStateInterface; +use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryId; /** * For full docs and context, see {@see RaceTrackerCatchUpHook} * + * @implements CatchUpHookFactoryInterface * @internal */ final class RaceTrackerCatchUpHookFactory implements CatchUpHookFactoryInterface { - public function build(ContentRepository $contentRepository): CatchUpHookInterface + public function build(ContentRepositoryId $contentRepositoryId, ProjectionStateInterface $projectionState): CatchUpHookInterface { return new RaceTrackerCatchUpHook(); } diff --git a/Neos.ContentRepository.Core/Classes/ContentRepository.php b/Neos.ContentRepository.Core/Classes/ContentRepository.php index d966002fa7b..8587b3fc9cd 100644 --- a/Neos.ContentRepository.Core/Classes/ContentRepository.php +++ b/Neos.ContentRepository.Core/Classes/ContentRepository.php @@ -147,7 +147,7 @@ public function catchUpProjection(string $projectionClassName, CatchUpOptions $o $projection = $this->projectionsAndCatchUpHooks->projections->get($projectionClassName); $catchUpHookFactory = $this->projectionsAndCatchUpHooks->getCatchUpHookFactoryForProjection($projection); - $catchUpHook = $catchUpHookFactory?->build($this); + $catchUpHook = $catchUpHookFactory?->build($this->id, $projection->getState()); // TODO allow custom stream name per projection $streamName = VirtualStreamName::all(); diff --git a/Neos.ContentRepository.Core/Classes/Factory/ProjectionsAndCatchUpHooksFactory.php b/Neos.ContentRepository.Core/Classes/Factory/ProjectionsAndCatchUpHooksFactory.php index cd369a87a6e..f48ed1345c0 100644 --- a/Neos.ContentRepository.Core/Classes/Factory/ProjectionsAndCatchUpHooksFactory.php +++ b/Neos.ContentRepository.Core/Classes/Factory/ProjectionsAndCatchUpHooksFactory.php @@ -6,12 +6,12 @@ use Neos\ContentRepository\Core\Projection\CatchUpHookFactories; use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryInterface; +use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphProjectionInterface; use Neos\ContentRepository\Core\Projection\ProjectionFactoryInterface; use Neos\ContentRepository\Core\Projection\ProjectionInterface; use Neos\ContentRepository\Core\Projection\Projections; use Neos\ContentRepository\Core\Projection\ProjectionsAndCatchUpHooks; use Neos\ContentRepository\Core\Projection\ProjectionStateInterface; -use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphProjectionInterface; /** * @api for custom framework integrations, not for users of the CR @@ -19,7 +19,7 @@ final class ProjectionsAndCatchUpHooksFactory { /** - * @var array>, options: array, catchUpHooksFactories: array}> + * @var array>, options: array, catchUpHooksFactories: array>}> */ private array $factories = []; @@ -40,7 +40,7 @@ public function registerFactory(ProjectionFactoryInterface $factory, array $opti /** * @param ProjectionFactoryInterface> $factory - * @param CatchUpHookFactoryInterface $catchUpHookFactory + * @param CatchUpHookFactoryInterface $catchUpHookFactory * @return void * @api */ diff --git a/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactories.php b/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactories.php index deabf53477b..f12fb3be7d4 100644 --- a/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactories.php +++ b/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactories.php @@ -4,18 +4,22 @@ namespace Neos\ContentRepository\Core\Projection; -use Neos\ContentRepository\Core\ContentRepository; +use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryId; /** + * @implements CatchUpHookFactoryInterface * @internal */ final class CatchUpHookFactories implements CatchUpHookFactoryInterface { /** - * @var array + * @var array> */ private array $catchUpHookFactories; + /** + * @param CatchUpHookFactoryInterface ...$catchUpHookFactories + */ private function __construct(CatchUpHookFactoryInterface ...$catchUpHookFactories) { $this->catchUpHookFactories = $catchUpHookFactories; @@ -26,6 +30,10 @@ public static function create(): self return new self(); } + /** + * @param CatchUpHookFactoryInterface $catchUpHookFactory + * @return self + */ public function with(CatchUpHookFactoryInterface $catchUpHookFactory): self { if ($this->has($catchUpHookFactory::class)) { @@ -44,9 +52,9 @@ private function has(string $catchUpHookFactoryClassName): bool return array_key_exists($catchUpHookFactoryClassName, $this->catchUpHookFactories); } - public function build(ContentRepository $contentRepository): CatchUpHookInterface + public function build(ContentRepositoryId $contentRepositoryId, ProjectionStateInterface $projectionState): CatchUpHookInterface { - $catchUpHooks = array_map(static fn(CatchUpHookFactoryInterface $catchUpHookFactory) => $catchUpHookFactory->build($contentRepository), $this->catchUpHookFactories); + $catchUpHooks = array_map(static fn(CatchUpHookFactoryInterface $catchUpHookFactory) => $catchUpHookFactory->build($contentRepositoryId, $projectionState), $this->catchUpHookFactories); return new DelegatingCatchUpHook(...$catchUpHooks); } } diff --git a/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactoryInterface.php b/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactoryInterface.php index ec84d096c16..10d918cd2d8 100644 --- a/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactoryInterface.php +++ b/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactoryInterface.php @@ -4,12 +4,21 @@ namespace Neos\ContentRepository\Core\Projection; -use Neos\ContentRepository\Core\ContentRepository; +use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryId; /** + * @template T of ProjectionStateInterface * @api */ interface CatchUpHookFactoryInterface { - public function build(ContentRepository $contentRepository): CatchUpHookInterface; + /** + * Note that a catchup doesn't have access to the full content repository, as it would allow full recursion via handle and accessing other projections + * state is not safe as the other projection might not be behind - the order is undefined. + * + * @param ContentRepositoryId $contentRepositoryId the content repository the catchup was registered in + * @param ProjectionStateInterface&T $projectionState the state of the projection the catchup was registered to (Its only safe to access this projections state) + * @return CatchUpHookInterface + */ + public function build(ContentRepositoryId $contentRepositoryId, ProjectionStateInterface $projectionState): CatchUpHookInterface; } diff --git a/Neos.ContentRepository.Core/Classes/Projection/ContentGraph/ContentGraphReadModelInterface.php b/Neos.ContentRepository.Core/Classes/Projection/ContentGraph/ContentGraphReadModelInterface.php index e1298bc151e..5f157f8d708 100644 --- a/Neos.ContentRepository.Core/Classes/Projection/ContentGraph/ContentGraphReadModelInterface.php +++ b/Neos.ContentRepository.Core/Classes/Projection/ContentGraph/ContentGraphReadModelInterface.php @@ -24,7 +24,11 @@ use Neos\ContentRepository\Core\SharedModel\Workspace\Workspaces; /** - * @api for creating a custom content repository graph projection implementation, **not for users of the CR** + * This low level interface gives access to the content graph and workspaces + * + * Generally this is not accessible for users of the CR, except for registering a catchup-hook on the content graph + * + * @api as dependency in catchup hooks and for creating a custom content repository graph projection implementation */ interface ContentGraphReadModelInterface extends ProjectionStateInterface { diff --git a/Neos.ContentRepository.Core/Classes/Projection/ProjectionsAndCatchUpHooks.php b/Neos.ContentRepository.Core/Classes/Projection/ProjectionsAndCatchUpHooks.php index 255e59b7600..d7b674babdb 100644 --- a/Neos.ContentRepository.Core/Classes/Projection/ProjectionsAndCatchUpHooks.php +++ b/Neos.ContentRepository.Core/Classes/Projection/ProjectionsAndCatchUpHooks.php @@ -26,6 +26,7 @@ public function __construct( /** * @param ProjectionInterface $projection + * @return ?CatchUpHookFactoryInterface */ public function getCatchUpHookFactoryForProjection(ProjectionInterface $projection): ?CatchUpHookFactoryInterface { diff --git a/Neos.ContentRepositoryRegistry/Classes/SubgraphCachingInMemory/FlushSubgraphCachePoolCatchUpHookFactory.php b/Neos.ContentRepositoryRegistry/Classes/SubgraphCachingInMemory/FlushSubgraphCachePoolCatchUpHookFactory.php index f31545386b3..72f8bb5a7c3 100644 --- a/Neos.ContentRepositoryRegistry/Classes/SubgraphCachingInMemory/FlushSubgraphCachePoolCatchUpHookFactory.php +++ b/Neos.ContentRepositoryRegistry/Classes/SubgraphCachingInMemory/FlushSubgraphCachePoolCatchUpHookFactory.php @@ -4,13 +4,16 @@ namespace Neos\ContentRepositoryRegistry\SubgraphCachingInMemory; -use Neos\ContentRepository\Core\ContentRepository; use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryInterface; use Neos\ContentRepository\Core\Projection\CatchUpHookInterface; +use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphReadModelInterface; +use Neos\ContentRepository\Core\Projection\ProjectionStateInterface; +use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryId; /** * Factory for {@see FlushSubgraphCachePoolCatchUpHook}, auto-registered in Settings.yaml for GraphProjection * + * @implements CatchUpHookFactoryInterface * @internal */ class FlushSubgraphCachePoolCatchUpHookFactory implements CatchUpHookFactoryInterface @@ -20,7 +23,8 @@ public function __construct( private readonly SubgraphCachePool $subgraphCachePool ) { } - public function build(ContentRepository $contentRepository): CatchUpHookInterface + + public function build(ContentRepositoryId $contentRepositoryId, ProjectionStateInterface $projectionState): CatchUpHookInterface { return new FlushSubgraphCachePoolCatchUpHook($this->subgraphCachePool); } diff --git a/Neos.Neos/Classes/AssetUsage/CatchUpHook/AssetUsageCatchUpHook.php b/Neos.Neos/Classes/AssetUsage/CatchUpHook/AssetUsageCatchUpHook.php index 97b970ba6cc..e52b55bb99c 100644 --- a/Neos.Neos/Classes/AssetUsage/CatchUpHook/AssetUsageCatchUpHook.php +++ b/Neos.Neos/Classes/AssetUsage/CatchUpHook/AssetUsageCatchUpHook.php @@ -4,7 +4,6 @@ namespace Neos\Neos\AssetUsage\CatchUpHook; -use Neos\ContentRepository\Core\ContentRepository; use Neos\ContentRepository\Core\DimensionSpace\DimensionSpacePoint; use Neos\ContentRepository\Core\DimensionSpace\DimensionSpacePointSet; use Neos\ContentRepository\Core\EventStore\EventInterface; @@ -21,9 +20,11 @@ use Neos\ContentRepository\Core\Feature\WorkspacePublication\Event\WorkspaceWasDiscarded; use Neos\ContentRepository\Core\Feature\WorkspacePublication\Event\WorkspaceWasPartiallyDiscarded; use Neos\ContentRepository\Core\Projection\CatchUpHookInterface; +use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphReadModelInterface; use Neos\ContentRepository\Core\Projection\ContentGraph\Filter\FindDescendantNodesFilter; use Neos\ContentRepository\Core\Projection\ContentGraph\Node; use Neos\ContentRepository\Core\Projection\ContentGraph\VisibilityConstraints; +use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryId; use Neos\ContentRepository\Core\SharedModel\Exception\WorkspaceDoesNotExist; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; @@ -36,7 +37,8 @@ class AssetUsageCatchUpHook implements CatchUpHookInterface { public function __construct( - private readonly ContentRepository $contentRepository, + private readonly ContentRepositoryId $contentRepositoryId, + private readonly ContentGraphReadModelInterface $contentGraphReadModel, private readonly AssetUsageIndexingService $assetUsageIndexingService ) { } @@ -50,7 +52,7 @@ public function onBeforeEvent(EventInterface $eventInstance, EventEnvelope $even if ($eventInstance instanceof EmbedsWorkspaceName) { try { // Skip if the workspace does not exist: "The source workspace missing does not exist" https://github.com/neos/neos-development-collection/pull/5270 - $this->contentRepository->getContentGraph($eventInstance->getWorkspaceName()); + $this->contentGraphReadModel->getContentGraph($eventInstance->getWorkspaceName()); } catch (WorkspaceDoesNotExist) { return; } @@ -68,7 +70,7 @@ public function onAfterEvent(EventInterface $eventInstance, EventEnvelope $event if ($eventInstance instanceof EmbedsWorkspaceName) { try { // Skip if the workspace does not exist: "The source workspace missing does not exist" https://github.com/neos/neos-development-collection/pull/5270 - $this->contentRepository->getContentGraph($eventInstance->getWorkspaceName()); + $this->contentGraphReadModel->getContentGraph($eventInstance->getWorkspaceName()); } catch (WorkspaceDoesNotExist) { return; } @@ -97,7 +99,7 @@ public function onAfterCatchUp(): void private function updateNode(WorkspaceName $workspaceName, NodeAggregateId $nodeAggregateId, DimensionSpacePoint $dimensionSpacePoint): void { - $contentGraph = $this->contentRepository->getContentGraph($workspaceName); + $contentGraph = $this->contentGraphReadModel->getContentGraph($workspaceName); $node = $contentGraph->getSubgraph($dimensionSpacePoint, VisibilityConstraints::withoutRestrictions())->findNodeById($nodeAggregateId); if ($node === null) { @@ -106,14 +108,14 @@ private function updateNode(WorkspaceName $workspaceName, NodeAggregateId $nodeA } $this->assetUsageIndexingService->updateIndex( - $this->contentRepository->id, + $this->contentRepositoryId, $node ); } private function removeNodes(WorkspaceName $workspaceName, NodeAggregateId $nodeAggregateId, DimensionSpacePointSet $dimensionSpacePoints): void { - $contentGraph = $this->contentRepository->getContentGraph($workspaceName); + $contentGraph = $this->contentGraphReadModel->getContentGraph($workspaceName); foreach ($dimensionSpacePoints as $dimensionSpacePoint) { $subgraph = $contentGraph->getSubgraph($dimensionSpacePoint, VisibilityConstraints::withoutRestrictions()); @@ -125,7 +127,7 @@ private function removeNodes(WorkspaceName $workspaceName, NodeAggregateId $node /** @var Node $node */ foreach ($nodes as $node) { $this->assetUsageIndexingService->removeIndexForNode( - $this->contentRepository->id, + $this->contentRepositoryId, $node ); } @@ -134,7 +136,7 @@ private function removeNodes(WorkspaceName $workspaceName, NodeAggregateId $node private function discardWorkspace(WorkspaceName $workspaceName): void { - $this->assetUsageIndexingService->removeIndexForWorkspace($this->contentRepository->id, $workspaceName); + $this->assetUsageIndexingService->removeIndexForWorkspace($this->contentRepositoryId, $workspaceName); } private function discardNodes(WorkspaceName $workspaceName, NodeIdsToPublishOrDiscard $nodeIds): void @@ -145,7 +147,7 @@ private function discardNodes(WorkspaceName $workspaceName, NodeIdsToPublishOrDi continue; } $this->assetUsageIndexingService->removeIndexForWorkspaceNameNodeAggregateIdAndDimensionSpacePoint( - $this->contentRepository->id, + $this->contentRepositoryId, $workspaceName, $nodeId->nodeAggregateId, $nodeId->dimensionSpacePoint @@ -155,6 +157,6 @@ private function discardNodes(WorkspaceName $workspaceName, NodeIdsToPublishOrDi private function updateDimensionSpacePoint(WorkspaceName $workspaceName, DimensionSpacePoint $source, DimensionSpacePoint $target): void { - $this->assetUsageIndexingService->updateDimensionSpacePointInIndex($this->contentRepository->id, $workspaceName, $source, $target); + $this->assetUsageIndexingService->updateDimensionSpacePointInIndex($this->contentRepositoryId, $workspaceName, $source, $target); } } diff --git a/Neos.Neos/Classes/AssetUsage/CatchUpHook/AssetUsageCatchUpHookFactory.php b/Neos.Neos/Classes/AssetUsage/CatchUpHook/AssetUsageCatchUpHookFactory.php index 89bcec32e86..a420aa62e90 100644 --- a/Neos.Neos/Classes/AssetUsage/CatchUpHook/AssetUsageCatchUpHookFactory.php +++ b/Neos.Neos/Classes/AssetUsage/CatchUpHook/AssetUsageCatchUpHookFactory.php @@ -14,10 +14,15 @@ * source code. */ -use Neos\ContentRepository\Core\ContentRepository; use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryInterface; +use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphReadModelInterface; +use Neos\ContentRepository\Core\Projection\ProjectionStateInterface; +use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryId; use Neos\Neos\AssetUsage\Service\AssetUsageIndexingService; +/** + * @implements CatchUpHookFactoryInterface + */ class AssetUsageCatchUpHookFactory implements CatchUpHookFactoryInterface { public function __construct( @@ -25,10 +30,11 @@ public function __construct( ) { } - public function build(ContentRepository $contentRepository): AssetUsageCatchUpHook + public function build(ContentRepositoryId $contentRepositoryId, ProjectionStateInterface $projectionState): AssetUsageCatchUpHook { return new AssetUsageCatchUpHook( - $contentRepository, + $contentRepositoryId, + $projectionState, $this->assetUsageIndexingService ); } diff --git a/Neos.Neos/Classes/FrontendRouting/CatchUpHook/RouterCacheHook.php b/Neos.Neos/Classes/FrontendRouting/CatchUpHook/RouterCacheHook.php index b6529d5be4c..1dc70d4fac7 100644 --- a/Neos.Neos/Classes/FrontendRouting/CatchUpHook/RouterCacheHook.php +++ b/Neos.Neos/Classes/FrontendRouting/CatchUpHook/RouterCacheHook.php @@ -4,7 +4,6 @@ namespace Neos\Neos\FrontendRouting\CatchUpHook; -use Neos\ContentRepository\Core\ContentRepository; use Neos\ContentRepository\Core\DimensionSpace\DimensionSpacePoint; use Neos\ContentRepository\Core\EventStore\EventInterface; use Neos\ContentRepository\Core\Feature\NodeModification\Event\NodePropertiesWereSet; @@ -28,7 +27,7 @@ final class RouterCacheHook implements CatchUpHookInterface private array $tagsToFlush = []; public function __construct( - private readonly ContentRepository $contentRepository, + private readonly DocumentUriPathFinder $documentUriPathFinder, private readonly RouterCachingService $routerCachingService, ) { } @@ -85,7 +84,7 @@ private function onBeforeSubtreeWasTagged(SubtreeWasTagged $event): void $this->collectTagsToFlush($node); - $descendantsOfNode = $this->getState()->getDescendantsOfNode($node); + $descendantsOfNode = $this->documentUriPathFinder->getDescendantsOfNode($node); array_map($this->collectTagsToFlush(...), iterator_to_array($descendantsOfNode)); } } @@ -105,7 +104,7 @@ private function onBeforeNodeAggregateWasRemoved(NodeAggregateWasRemoved $event) $this->collectTagsToFlush($node); - $descendantsOfNode = $this->getState()->getDescendantsOfNode($node); + $descendantsOfNode = $this->documentUriPathFinder->getDescendantsOfNode($node); array_map($this->collectTagsToFlush(...), iterator_to_array($descendantsOfNode)); } } @@ -130,7 +129,7 @@ private function onBeforeNodePropertiesWereSet(NodePropertiesWereSet $event): vo $this->collectTagsToFlush($node); - $descendantsOfNode = $this->getState()->getDescendantsOfNode($node); + $descendantsOfNode = $this->documentUriPathFinder->getDescendantsOfNode($node); array_map($this->collectTagsToFlush(...), iterator_to_array($descendantsOfNode)); } } @@ -153,7 +152,7 @@ private function onBeforeNodeAggregateWasMoved(NodeAggregateWasMoved $event): vo $this->collectTagsToFlush($node); - $descendantsOfNode = $this->getState()->getDescendantsOfNode($node); + $descendantsOfNode = $this->documentUriPathFinder->getDescendantsOfNode($node); array_map($this->collectTagsToFlush(...), iterator_to_array($descendantsOfNode)); } } @@ -173,15 +172,10 @@ private function flushAllCollectedTags(): void $this->tagsToFlush = []; } - private function getState(): DocumentUriPathFinder - { - return $this->contentRepository->projectionState(DocumentUriPathFinder::class); - } - private function findDocumentNodeInfoByIdAndDimensionSpacePoint(NodeAggregateId $nodeAggregateId, DimensionSpacePoint $dimensionSpacePoint): ?DocumentNodeInfo { try { - return $this->getState()->getByIdAndDimensionSpacePointHash( + return $this->documentUriPathFinder->getByIdAndDimensionSpacePointHash( $nodeAggregateId, $dimensionSpacePoint->hash ); diff --git a/Neos.Neos/Classes/FrontendRouting/CatchUpHook/RouterCacheHookFactory.php b/Neos.Neos/Classes/FrontendRouting/CatchUpHook/RouterCacheHookFactory.php index 15b92e86c39..432aff8a0cb 100644 --- a/Neos.Neos/Classes/FrontendRouting/CatchUpHook/RouterCacheHookFactory.php +++ b/Neos.Neos/Classes/FrontendRouting/CatchUpHook/RouterCacheHookFactory.php @@ -4,12 +4,16 @@ namespace Neos\Neos\FrontendRouting\CatchUpHook; -use Neos\ContentRepository\Core\ContentRepository; use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryInterface; use Neos\ContentRepository\Core\Projection\CatchUpHookInterface; +use Neos\ContentRepository\Core\Projection\ProjectionStateInterface; +use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryId; use Neos\Flow\Mvc\Routing\RouterCachingService; -use Neos\RedirectHandler\NeosAdapter\Service\NodeRedirectService; +use Neos\Neos\FrontendRouting\Projection\DocumentUriPathFinder; +/** + * @implements CatchUpHookFactoryInterface + */ final class RouterCacheHookFactory implements CatchUpHookFactoryInterface { public function __construct( @@ -17,10 +21,10 @@ public function __construct( ) { } - public function build(ContentRepository $contentRepository): CatchUpHookInterface + public function build(ContentRepositoryId $contentRepositoryId, ProjectionStateInterface $projectionState): CatchUpHookInterface { return new RouterCacheHook( - $contentRepository, + $projectionState, $this->routerCachingService ); } diff --git a/Neos.Neos/Classes/Fusion/Cache/GraphProjectorCatchUpHookForCacheFlushing.php b/Neos.Neos/Classes/Fusion/Cache/GraphProjectorCatchUpHookForCacheFlushing.php index 19ffd145d04..349d4eb3ac7 100644 --- a/Neos.Neos/Classes/Fusion/Cache/GraphProjectorCatchUpHookForCacheFlushing.php +++ b/Neos.Neos/Classes/Fusion/Cache/GraphProjectorCatchUpHookForCacheFlushing.php @@ -14,7 +14,6 @@ * source code. */ -use Neos\ContentRepository\Core\ContentRepository; use Neos\ContentRepository\Core\EventStore\EventInterface; use Neos\ContentRepository\Core\Feature\Common\EmbedsContentStreamId; use Neos\ContentRepository\Core\Feature\Common\EmbedsNodeAggregateId; @@ -37,7 +36,9 @@ use Neos\ContentRepository\Core\Feature\WorkspacePublication\Event\WorkspaceWasPartiallyDiscarded; use Neos\ContentRepository\Core\Feature\WorkspaceRebase\Event\WorkspaceWasRebased; use Neos\ContentRepository\Core\Projection\CatchUpHookInterface; +use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphReadModelInterface; use Neos\ContentRepository\Core\Projection\ContentGraph\NodeAggregate; +use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryId; use Neos\ContentRepository\Core\SharedModel\Exception\WorkspaceDoesNotExist; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateIds; @@ -107,7 +108,8 @@ public static function disabled(\Closure $fn): void public function __construct( - private readonly ContentRepository $contentRepository, + private readonly ContentRepositoryId $contentRepositoryId, + private readonly ContentGraphReadModelInterface $contentGraphReadModel, private readonly ContentCacheFlusher $contentCacheFlusher ) { } @@ -159,7 +161,7 @@ public function onBeforeEvent(EventInterface $eventInstance, EventEnvelope $even || $eventInstance instanceof NodeAggregateWasMoved ) { try { - $contentGraph = $this->contentRepository->getContentGraph($eventInstance->workspaceName); + $contentGraph = $this->contentGraphReadModel->getContentGraph($eventInstance->workspaceName); } catch (WorkspaceDoesNotExist) { return; } @@ -169,7 +171,7 @@ public function onBeforeEvent(EventInterface $eventInstance, EventEnvelope $even ); if ($nodeAggregate) { $this->scheduleCacheFlushJobForNodeAggregate( - $this->contentRepository, + $this->contentRepositoryId, $eventInstance->workspaceName, $nodeAggregate ); @@ -194,7 +196,7 @@ public function onAfterEvent(EventInterface $eventInstance, EventEnvelope $event || $eventInstance instanceof WorkspaceWasPartiallyDiscarded || $eventInstance instanceof WorkspaceWasRebased ) { - $this->scheduleCacheFlushJobForWorkspaceName($this->contentRepository, $eventInstance->workspaceName); + $this->scheduleCacheFlushJobForWorkspaceName($this->contentRepositoryId, $eventInstance->workspaceName); } elseif ( !($eventInstance instanceof NodeAggregateWasRemoved) && $eventInstance instanceof EmbedsNodeAggregateId @@ -202,7 +204,7 @@ public function onAfterEvent(EventInterface $eventInstance, EventEnvelope $event && $eventInstance instanceof EmbedsWorkspaceName ) { try { - $nodeAggregate = $this->contentRepository->getContentGraph($eventInstance->getWorkspaceName())->findNodeAggregateById( + $nodeAggregate = $this->contentGraphReadModel->getContentGraph($eventInstance->getWorkspaceName())->findNodeAggregateById( $eventInstance->getNodeAggregateId() ); } catch (WorkspaceDoesNotExist) { @@ -211,7 +213,7 @@ public function onAfterEvent(EventInterface $eventInstance, EventEnvelope $event if ($nodeAggregate) { $this->scheduleCacheFlushJobForNodeAggregate( - $this->contentRepository, + $this->contentRepositoryId, $eventInstance->getWorkspaceName(), $nodeAggregate ); @@ -220,13 +222,13 @@ public function onAfterEvent(EventInterface $eventInstance, EventEnvelope $event } private function scheduleCacheFlushJobForNodeAggregate( - ContentRepository $contentRepository, + ContentRepositoryId $contentRepositoryId, WorkspaceName $workspaceName, NodeAggregate $nodeAggregate ): void { // we store this in an associative array deduplicate. $this->flushNodeAggregateRequestsOnAfterCatchUp[$workspaceName->value . '__' . $nodeAggregate->nodeAggregateId->value] = FlushNodeAggregateRequest::create( - $contentRepository->id, + $contentRepositoryId, $workspaceName, $nodeAggregate->nodeAggregateId, $nodeAggregate->nodeTypeName, @@ -235,19 +237,19 @@ private function scheduleCacheFlushJobForNodeAggregate( } private function scheduleCacheFlushJobForWorkspaceName( - ContentRepository $contentRepository, + ContentRepositoryId $contentRepositoryId, WorkspaceName $workspaceName ): void { // we store this in an associative array deduplicate. $this->flushWorkspaceRequestsOnAfterCatchUp[$workspaceName->value] = FlushWorkspaceRequest::create( - $contentRepository->id, + $contentRepositoryId, $workspaceName, ); } private function determineAncestorNodeAggregateIds(WorkspaceName $workspaceName, NodeAggregateId $childNodeAggregateId): NodeAggregateIds { - $contentGraph = $this->contentRepository->getContentGraph($workspaceName); + $contentGraph = $this->contentGraphReadModel->getContentGraph($workspaceName); $stack = iterator_to_array($contentGraph->findParentNodeAggregates($childNodeAggregateId)); $ancestorNodeAggregateIds = []; diff --git a/Neos.Neos/Classes/Fusion/Cache/GraphProjectorCatchUpHookForCacheFlushingFactory.php b/Neos.Neos/Classes/Fusion/Cache/GraphProjectorCatchUpHookForCacheFlushingFactory.php index 62e8c499008..b2ea3d3a433 100644 --- a/Neos.Neos/Classes/Fusion/Cache/GraphProjectorCatchUpHookForCacheFlushingFactory.php +++ b/Neos.Neos/Classes/Fusion/Cache/GraphProjectorCatchUpHookForCacheFlushingFactory.php @@ -14,9 +14,14 @@ * source code. */ -use Neos\ContentRepository\Core\ContentRepository; use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryInterface; +use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphReadModelInterface; +use Neos\ContentRepository\Core\Projection\ProjectionStateInterface; +use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryId; +/** + * @implements CatchUpHookFactoryInterface + */ class GraphProjectorCatchUpHookForCacheFlushingFactory implements CatchUpHookFactoryInterface { public function __construct( @@ -24,10 +29,11 @@ public function __construct( ) { } - public function build(ContentRepository $contentRepository): GraphProjectorCatchUpHookForCacheFlushing + public function build(ContentRepositoryId $contentRepositoryId, ProjectionStateInterface $projectionState): GraphProjectorCatchUpHookForCacheFlushing { return new GraphProjectorCatchUpHookForCacheFlushing( - $contentRepository, + $contentRepositoryId, + $projectionState, $this->contentCacheFlusher ); } From 03408f234b715cf6516d8bdcaaddeaf02080651b Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Sat, 2 Nov 2024 16:51:25 +0100 Subject: [PATCH 2/3] TASK: Introduce `CatchUpHookFactoryDependencies` to also pass NodeTypeManager and other objects that would be available on the content repository --- .../RaceTrackerCatchUpHookFactory.php | 5 +-- .../Classes/ContentRepository.php | 10 ++++- .../Projection/CatchUpHookFactories.php | 6 +-- .../CatchUpHookFactoryDependencies.php | 41 +++++++++++++++++++ .../CatchUpHookFactoryInterface.php | 7 +--- ...ushSubgraphCachePoolCatchUpHookFactory.php | 5 +-- .../AssetUsageCatchUpHookFactory.php | 9 ++-- .../CatchUpHook/RouterCacheHookFactory.php | 7 ++-- ...ctorCatchUpHookForCacheFlushingFactory.php | 9 ++-- 9 files changed, 68 insertions(+), 31 deletions(-) create mode 100644 Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactoryDependencies.php diff --git a/Neos.ContentRepository.BehavioralTests/Classes/ProjectionRaceConditionTester/RaceTrackerCatchUpHookFactory.php b/Neos.ContentRepository.BehavioralTests/Classes/ProjectionRaceConditionTester/RaceTrackerCatchUpHookFactory.php index c123247b704..389d7a324a5 100644 --- a/Neos.ContentRepository.BehavioralTests/Classes/ProjectionRaceConditionTester/RaceTrackerCatchUpHookFactory.php +++ b/Neos.ContentRepository.BehavioralTests/Classes/ProjectionRaceConditionTester/RaceTrackerCatchUpHookFactory.php @@ -14,11 +14,10 @@ namespace Neos\ContentRepository\BehavioralTests\ProjectionRaceConditionTester; +use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryDependencies; use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryInterface; use Neos\ContentRepository\Core\Projection\CatchUpHookInterface; use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphReadModelInterface; -use Neos\ContentRepository\Core\Projection\ProjectionStateInterface; -use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryId; /** * For full docs and context, see {@see RaceTrackerCatchUpHook} @@ -28,7 +27,7 @@ */ final class RaceTrackerCatchUpHookFactory implements CatchUpHookFactoryInterface { - public function build(ContentRepositoryId $contentRepositoryId, ProjectionStateInterface $projectionState): CatchUpHookInterface + public function build(CatchUpHookFactoryDependencies $dependencies): CatchUpHookInterface { return new RaceTrackerCatchUpHook(); } diff --git a/Neos.ContentRepository.Core/Classes/ContentRepository.php b/Neos.ContentRepository.Core/Classes/ContentRepository.php index 8587b3fc9cd..f474dda8191 100644 --- a/Neos.ContentRepository.Core/Classes/ContentRepository.php +++ b/Neos.ContentRepository.Core/Classes/ContentRepository.php @@ -25,6 +25,7 @@ use Neos\ContentRepository\Core\Factory\ContentRepositoryFactory; use Neos\ContentRepository\Core\NodeType\NodeTypeManager; use Neos\ContentRepository\Core\Projection\CatchUp; +use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryDependencies; use Neos\ContentRepository\Core\Projection\CatchUpOptions; use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphInterface; use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphProjectionInterface; @@ -45,7 +46,6 @@ use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; use Neos\ContentRepository\Core\SharedModel\Workspace\Workspaces; use Neos\EventStore\EventStoreInterface; -use Neos\EventStore\Exception\ConcurrencyException; use Neos\EventStore\Model\EventEnvelope; use Neos\EventStore\Model\EventStream\VirtualStreamName; use Psr\Clock\ClockInterface; @@ -147,7 +147,13 @@ public function catchUpProjection(string $projectionClassName, CatchUpOptions $o $projection = $this->projectionsAndCatchUpHooks->projections->get($projectionClassName); $catchUpHookFactory = $this->projectionsAndCatchUpHooks->getCatchUpHookFactoryForProjection($projection); - $catchUpHook = $catchUpHookFactory?->build($this->id, $projection->getState()); + $catchUpHook = $catchUpHookFactory?->build(new CatchUpHookFactoryDependencies( + $this->id, + $projection->getState(), + $this->nodeTypeManager, + $this->contentDimensionSource, + $this->variationGraph + )); // TODO allow custom stream name per projection $streamName = VirtualStreamName::all(); diff --git a/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactories.php b/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactories.php index f12fb3be7d4..efa364124ba 100644 --- a/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactories.php +++ b/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactories.php @@ -4,8 +4,6 @@ namespace Neos\ContentRepository\Core\Projection; -use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryId; - /** * @implements CatchUpHookFactoryInterface * @internal @@ -52,9 +50,9 @@ private function has(string $catchUpHookFactoryClassName): bool return array_key_exists($catchUpHookFactoryClassName, $this->catchUpHookFactories); } - public function build(ContentRepositoryId $contentRepositoryId, ProjectionStateInterface $projectionState): CatchUpHookInterface + public function build(CatchUpHookFactoryDependencies $dependencies): CatchUpHookInterface { - $catchUpHooks = array_map(static fn(CatchUpHookFactoryInterface $catchUpHookFactory) => $catchUpHookFactory->build($contentRepositoryId, $projectionState), $this->catchUpHookFactories); + $catchUpHooks = array_map(static fn(CatchUpHookFactoryInterface $catchUpHookFactory) => $catchUpHookFactory->build($dependencies), $this->catchUpHookFactories); return new DelegatingCatchUpHook(...$catchUpHooks); } } diff --git a/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactoryDependencies.php b/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactoryDependencies.php new file mode 100644 index 00000000000..037e4164150 --- /dev/null +++ b/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactoryDependencies.php @@ -0,0 +1,41 @@ + $dependencies available dependencies to intialise the catchup hook * @return CatchUpHookInterface */ - public function build(ContentRepositoryId $contentRepositoryId, ProjectionStateInterface $projectionState): CatchUpHookInterface; + public function build(CatchUpHookFactoryDependencies $dependencies): CatchUpHookInterface; } diff --git a/Neos.ContentRepositoryRegistry/Classes/SubgraphCachingInMemory/FlushSubgraphCachePoolCatchUpHookFactory.php b/Neos.ContentRepositoryRegistry/Classes/SubgraphCachingInMemory/FlushSubgraphCachePoolCatchUpHookFactory.php index 72f8bb5a7c3..cebe03ebb43 100644 --- a/Neos.ContentRepositoryRegistry/Classes/SubgraphCachingInMemory/FlushSubgraphCachePoolCatchUpHookFactory.php +++ b/Neos.ContentRepositoryRegistry/Classes/SubgraphCachingInMemory/FlushSubgraphCachePoolCatchUpHookFactory.php @@ -4,11 +4,10 @@ namespace Neos\ContentRepositoryRegistry\SubgraphCachingInMemory; +use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryDependencies; use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryInterface; use Neos\ContentRepository\Core\Projection\CatchUpHookInterface; use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphReadModelInterface; -use Neos\ContentRepository\Core\Projection\ProjectionStateInterface; -use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryId; /** * Factory for {@see FlushSubgraphCachePoolCatchUpHook}, auto-registered in Settings.yaml for GraphProjection @@ -24,7 +23,7 @@ public function __construct( ) { } - public function build(ContentRepositoryId $contentRepositoryId, ProjectionStateInterface $projectionState): CatchUpHookInterface + public function build(CatchUpHookFactoryDependencies $dependencies): CatchUpHookInterface { return new FlushSubgraphCachePoolCatchUpHook($this->subgraphCachePool); } diff --git a/Neos.Neos/Classes/AssetUsage/CatchUpHook/AssetUsageCatchUpHookFactory.php b/Neos.Neos/Classes/AssetUsage/CatchUpHook/AssetUsageCatchUpHookFactory.php index a420aa62e90..4188a10072f 100644 --- a/Neos.Neos/Classes/AssetUsage/CatchUpHook/AssetUsageCatchUpHookFactory.php +++ b/Neos.Neos/Classes/AssetUsage/CatchUpHook/AssetUsageCatchUpHookFactory.php @@ -14,10 +14,9 @@ * source code. */ +use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryDependencies; use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryInterface; use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphReadModelInterface; -use Neos\ContentRepository\Core\Projection\ProjectionStateInterface; -use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryId; use Neos\Neos\AssetUsage\Service\AssetUsageIndexingService; /** @@ -30,11 +29,11 @@ public function __construct( ) { } - public function build(ContentRepositoryId $contentRepositoryId, ProjectionStateInterface $projectionState): AssetUsageCatchUpHook + public function build(CatchUpHookFactoryDependencies $dependencies): AssetUsageCatchUpHook { return new AssetUsageCatchUpHook( - $contentRepositoryId, - $projectionState, + $dependencies->contentRepositoryId, + $dependencies->projectionState, $this->assetUsageIndexingService ); } diff --git a/Neos.Neos/Classes/FrontendRouting/CatchUpHook/RouterCacheHookFactory.php b/Neos.Neos/Classes/FrontendRouting/CatchUpHook/RouterCacheHookFactory.php index 432aff8a0cb..cbdd469d930 100644 --- a/Neos.Neos/Classes/FrontendRouting/CatchUpHook/RouterCacheHookFactory.php +++ b/Neos.Neos/Classes/FrontendRouting/CatchUpHook/RouterCacheHookFactory.php @@ -4,10 +4,9 @@ namespace Neos\Neos\FrontendRouting\CatchUpHook; +use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryDependencies; use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryInterface; use Neos\ContentRepository\Core\Projection\CatchUpHookInterface; -use Neos\ContentRepository\Core\Projection\ProjectionStateInterface; -use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryId; use Neos\Flow\Mvc\Routing\RouterCachingService; use Neos\Neos\FrontendRouting\Projection\DocumentUriPathFinder; @@ -21,10 +20,10 @@ public function __construct( ) { } - public function build(ContentRepositoryId $contentRepositoryId, ProjectionStateInterface $projectionState): CatchUpHookInterface + public function build(CatchUpHookFactoryDependencies $dependencies): CatchUpHookInterface { return new RouterCacheHook( - $projectionState, + $dependencies->projectionState, $this->routerCachingService ); } diff --git a/Neos.Neos/Classes/Fusion/Cache/GraphProjectorCatchUpHookForCacheFlushingFactory.php b/Neos.Neos/Classes/Fusion/Cache/GraphProjectorCatchUpHookForCacheFlushingFactory.php index b2ea3d3a433..a988f1bcac6 100644 --- a/Neos.Neos/Classes/Fusion/Cache/GraphProjectorCatchUpHookForCacheFlushingFactory.php +++ b/Neos.Neos/Classes/Fusion/Cache/GraphProjectorCatchUpHookForCacheFlushingFactory.php @@ -14,10 +14,9 @@ * source code. */ +use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryDependencies; use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryInterface; use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphReadModelInterface; -use Neos\ContentRepository\Core\Projection\ProjectionStateInterface; -use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryId; /** * @implements CatchUpHookFactoryInterface @@ -29,11 +28,11 @@ public function __construct( ) { } - public function build(ContentRepositoryId $contentRepositoryId, ProjectionStateInterface $projectionState): GraphProjectorCatchUpHookForCacheFlushing + public function build(CatchUpHookFactoryDependencies $dependencies): GraphProjectorCatchUpHookForCacheFlushing { return new GraphProjectorCatchUpHookForCacheFlushing( - $contentRepositoryId, - $projectionState, + $dependencies->contentRepositoryId, + $dependencies->projectionState, $this->contentCacheFlusher ); } From 6b4334172b19812c6026fb7c12daa92c9d38e310 Mon Sep 17 00:00:00 2001 From: Jenkins Date: Mon, 4 Nov 2024 09:44:13 +0000 Subject: [PATCH 3/3] TASK: Update references [skip ci] --- Neos.Neos/Documentation/References/CommandReference.rst | 2 +- Neos.Neos/Documentation/References/ViewHelpers/FluidAdaptor.rst | 2 +- Neos.Neos/Documentation/References/ViewHelpers/Form.rst | 2 +- Neos.Neos/Documentation/References/ViewHelpers/Media.rst | 2 +- Neos.Neos/Documentation/References/ViewHelpers/Neos.rst | 2 +- Neos.Neos/Documentation/References/ViewHelpers/TYPO3Fluid.rst | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Neos.Neos/Documentation/References/CommandReference.rst b/Neos.Neos/Documentation/References/CommandReference.rst index d29bcf602fb..beaa86ac5dc 100644 --- a/Neos.Neos/Documentation/References/CommandReference.rst +++ b/Neos.Neos/Documentation/References/CommandReference.rst @@ -19,7 +19,7 @@ commands that may be available, use:: ./flow help -The following reference was automatically generated from code on 2024-11-01 +The following reference was automatically generated from code on 2024-11-04 .. _`Neos Command Reference: NEOS.FLOW`: diff --git a/Neos.Neos/Documentation/References/ViewHelpers/FluidAdaptor.rst b/Neos.Neos/Documentation/References/ViewHelpers/FluidAdaptor.rst index 2bbdacda300..ab86c36bdb5 100644 --- a/Neos.Neos/Documentation/References/ViewHelpers/FluidAdaptor.rst +++ b/Neos.Neos/Documentation/References/ViewHelpers/FluidAdaptor.rst @@ -3,7 +3,7 @@ FluidAdaptor ViewHelper Reference ################################# -This reference was automatically generated from code on 2024-11-01 +This reference was automatically generated from code on 2024-11-04 .. _`FluidAdaptor ViewHelper Reference: f:debug`: diff --git a/Neos.Neos/Documentation/References/ViewHelpers/Form.rst b/Neos.Neos/Documentation/References/ViewHelpers/Form.rst index 19f37c00268..f4cb783d1b7 100644 --- a/Neos.Neos/Documentation/References/ViewHelpers/Form.rst +++ b/Neos.Neos/Documentation/References/ViewHelpers/Form.rst @@ -3,7 +3,7 @@ Form ViewHelper Reference ######################### -This reference was automatically generated from code on 2024-11-01 +This reference was automatically generated from code on 2024-11-04 .. _`Form ViewHelper Reference: neos.form:form`: diff --git a/Neos.Neos/Documentation/References/ViewHelpers/Media.rst b/Neos.Neos/Documentation/References/ViewHelpers/Media.rst index ed563bd61a3..aa9c60fdc2d 100644 --- a/Neos.Neos/Documentation/References/ViewHelpers/Media.rst +++ b/Neos.Neos/Documentation/References/ViewHelpers/Media.rst @@ -3,7 +3,7 @@ Media ViewHelper Reference ########################## -This reference was automatically generated from code on 2024-11-01 +This reference was automatically generated from code on 2024-11-04 .. _`Media ViewHelper Reference: neos.media:fileTypeIcon`: diff --git a/Neos.Neos/Documentation/References/ViewHelpers/Neos.rst b/Neos.Neos/Documentation/References/ViewHelpers/Neos.rst index b0fa029530a..7f6f36a8242 100644 --- a/Neos.Neos/Documentation/References/ViewHelpers/Neos.rst +++ b/Neos.Neos/Documentation/References/ViewHelpers/Neos.rst @@ -3,7 +3,7 @@ Neos ViewHelper Reference ######################### -This reference was automatically generated from code on 2024-11-01 +This reference was automatically generated from code on 2024-11-04 .. _`Neos ViewHelper Reference: neos:backend.authenticationProviderLabel`: diff --git a/Neos.Neos/Documentation/References/ViewHelpers/TYPO3Fluid.rst b/Neos.Neos/Documentation/References/ViewHelpers/TYPO3Fluid.rst index 7e37fc3a530..2e67bf7f29c 100644 --- a/Neos.Neos/Documentation/References/ViewHelpers/TYPO3Fluid.rst +++ b/Neos.Neos/Documentation/References/ViewHelpers/TYPO3Fluid.rst @@ -3,7 +3,7 @@ TYPO3 Fluid ViewHelper Reference ################################ -This reference was automatically generated from code on 2024-11-01 +This reference was automatically generated from code on 2024-11-04 .. _`TYPO3 Fluid ViewHelper Reference: f:alias`: