eZ\Publish\Core\MVC\Symfony\Cache\Http\EventListener\RelatedLocationsListener::onContentCacheClear PHP Method

onContentCacheClear() public method

public onContentCacheClear ( ContentCacheClearEvent $event )
$event eZ\Publish\Core\MVC\Symfony\Event\ContentCacheClearEvent
    public function onContentCacheClear(ContentCacheClearEvent $event)
    {
        $contentInfo = $event->getContentInfo();
        $versionInfo = $this->contentService->loadVersionInfo($contentInfo);
        foreach ($this->contentService->loadRelations($versionInfo) as $relation) {
            foreach ($this->locationService->loadLocations($relation->getDestinationContentInfo()) as $relatedLocation) {
                $event->addLocationToClear($relatedLocation);
            }
        }
        // Using sudo since loading reverse relations is conditioned to content/reverserelatedlist permission and we don't need this check here.
        /** @var \eZ\Publish\API\Repository\Values\Content\Relation[] $reverseRelations */
        $reverseRelations = $this->repository->sudo(function () use($contentInfo) {
            return $this->contentService->loadReverseRelations($contentInfo);
        });
        foreach ($reverseRelations as $reverseRelation) {
            foreach ($this->locationService->loadLocations($reverseRelation->getSourceContentInfo()) as $relatedLocation) {
                $event->addLocationToClear($relatedLocation);
            }
        }
    }

Usage Example

 public function testOnContentCacheClear()
 {
     $contentId = 123;
     $contentInfo = new ContentInfo(['id' => $contentId]);
     $event = new ContentCacheClearEvent($contentInfo);
     $versionInfo = new VersionInfo();
     $this->contentService->expects($this->once())->method('loadVersionInfo')->with($contentInfo)->will($this->returnValue($versionInfo));
     // Relation
     $relatedContentInfo1 = new ContentInfo(['id' => 1]);
     $relatedLocation1 = new Location();
     $relatedContentInfo2 = new ContentInfo(['id' => 2]);
     $relatedLocation2 = new Location();
     $relatedLocation3 = new Location();
     $relations = [new Relation(['destinationContentInfo' => $relatedContentInfo1]), new Relation(['destinationContentInfo' => $relatedContentInfo2])];
     $this->contentService->expects($this->once())->method('loadRelations')->with($versionInfo)->will($this->returnValue($relations));
     // Reverse relations
     $reverseRelatedContentInfo = new ContentInfo();
     $relatedLocation4 = new Location();
     $reverseRelations = [new Relation(['sourceContentInfo' => $reverseRelatedContentInfo])];
     $this->contentService->expects($this->once())->method('loadReverseRelations')->with($contentInfo)->will($this->returnValue($reverseRelations));
     // Relation locations loading with locationService
     $this->locationService->expects($this->exactly(count($relations) + count($reverseRelations)))->method('loadLocations')->will($this->returnValueMap([[$relatedContentInfo1, null, [$relatedLocation1]], [$relatedContentInfo2, null, [$relatedLocation2, $relatedLocation3]], [$reverseRelatedContentInfo, null, [$relatedLocation4]]]));
     $allRelatedLocations = [$relatedLocation1, $relatedLocation2, $relatedLocation3, $relatedLocation4];
     $this->listener->onContentCacheClear($event);
     $this->assertSame($allRelatedLocations, $event->getLocationsToClear());
 }