Skip to content

Commit

Permalink
EZP-30646: Reimplemented SignalSlots using EventDispatcher (#91)
Browse files Browse the repository at this point in the history
  • Loading branch information
Nattfarinn authored and lserwatka committed Aug 5, 2019
1 parent 7d3b479 commit 416a15f
Show file tree
Hide file tree
Showing 108 changed files with 845 additions and 3,644 deletions.
4 changes: 0 additions & 4 deletions spec/DependencyInjection/Compiler/KernelPassSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,12 @@ function it_disables_the_kernels_httpcache_services(ContainerBuilder $container,
$container->getAlias('ezpublish.http_cache.purger')->willReturn('some_random_id');
$container->getDefinitions()->willReturn([
'ezpublish.http_cache.witness_service' => new Definition(),
'ezpublish.http_cache.signalslot.some_slot' => new Definition(),
'ezpublish.http_cache.signalslot.some_other_slot' => new Definition(),
'ezpublish.cache_clear.content.some_listener' => new Definition(),
'ezpublish.view.cache_response_listener' => new Definition(),
'ezpublish.http_cache.purger.some_purger' => new Definition(),
'ezpublish.http_cache.purger.some_other_purger' => new Definition(),
'witness_service' => new Definition(),
]);
$container->removeDefinition('ezpublish.http_cache.signalslot.some_slot')->shouldBeCalled();
$container->removeDefinition('ezpublish.http_cache.signalslot.some_other_slot')->shouldBeCalled();
$container->removeDefinition('ezpublish.cache_clear.content.some_listener')->shouldBeCalled();
$container->removeDefinition('ezpublish.view.cache_response_listener')->shouldBeCalled();
$container->removeDefinition('ezpublish.http_cache.purger.some_purger')->shouldBeCalled();
Expand Down
13 changes: 1 addition & 12 deletions src/DependencyInjection/Compiler/KernelPass.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@ class KernelPass implements CompilerPassInterface
public function process(ContainerBuilder $container)
{
foreach ($container->getDefinitions() as $id => $definition) {
if ($this->isSignalSlot($id) ||
$this->isSmartCacheListener($id) ||
if ($this->isSmartCacheListener($id) ||
$this->isResponseCacheListener($id) ||
$this->isCachePurger($id)
) {
Expand Down Expand Up @@ -62,16 +61,6 @@ protected function removeKernelRoleIdContextProvider(ContainerBuilder $container
$container->getDefinition('fos_http_cache.user_context.hash_generator')->setArguments($arguments);
}

/**
* @param string $id
*
* @return bool
*/
protected function isSignalSlot($id)
{
return strpos($id, 'ezpublish.http_cache.signalslot.') === 0;
}

/**
* @param string $id
*
Expand Down
2 changes: 1 addition & 1 deletion src/DependencyInjection/EzPlatformHttpCacheExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public function load(array $configs, ContainerBuilder $container)

$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
$loader->load('services.yml');
$loader->load('slot.yml');
$loader->load('event.yml');
$loader->load('view_cache.yml');
}

Expand Down
94 changes: 94 additions & 0 deletions src/EventSubscriber/CachePurge/AbstractSubscriber.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
<?php

/**
* @copyright Copyright (C) eZ Systems AS. All rights reserved.
* @license For full copyright and license information view LICENSE file distributed with this source code.
*/
declare(strict_types=1);

namespace EzSystems\PlatformHttpCacheBundle\EventSubscriber\CachePurge;

use EzSystems\PlatformHttpCacheBundle\PurgeClient\PurgeClientInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use eZ\Publish\SPI\Persistence\Content\Location\Handler as LocationHandler;
use eZ\Publish\SPI\Persistence\URL\Handler as UrlHandler;

/**
* @internal
*/
abstract class AbstractSubscriber implements EventSubscriberInterface
{
/** @var \EzSystems\PlatformHttpCacheBundle\PurgeClient\PurgeClientInterface */
protected $purgeClient;

/** @var \eZ\Publish\SPI\Persistence\Content\Location\Handler */
private $locationHandler;

/** @var \eZ\Publish\SPI\Persistence\URL\Handler */
private $urlHandler;

public function __construct(
PurgeClientInterface $purgeClient,
LocationHandler $locationHandler,
UrlHandler $urlHandler
) {
$this->purgeClient = $purgeClient;
$this->locationHandler = $locationHandler;
$this->urlHandler = $urlHandler;
}

public function getContentTags(int $contentId): array
{
return [
'content-' . $contentId,
'relation-' . $contentId,
];
}

public function getLocationTags(int $locationId): array
{
return [
'location-' . $locationId,
'parent-' . $locationId,
'relation-location-' . $locationId,
];
}

public function getParentLocationTags(int $locationId): array
{
return [
'location-' . $locationId,
'parent-' . $locationId,
];
}

public function getContentLocationsTags(int $contentId): array
{
$tags = [];

$locations = $this->locationHandler->loadLocationsByContent($contentId);

foreach ($locations as $location) {
$tags = array_merge(
$tags,
$this->getLocationTags($location->id),
$this->getParentLocationTags($location->parentId),
);
}

return $tags;
}

public function getContentUrlTags(int $urlId): array
{
$tags = [];

$contentIds = $this->urlHandler->findUsages($urlId);

foreach ($contentIds as $contentId) {
$tags[] = 'content-' . $contentId;
}

return $tags;
}
}
134 changes: 134 additions & 0 deletions src/EventSubscriber/CachePurge/ContentEventsSubscriber.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
<?php

/**
* @copyright Copyright (C) eZ Systems AS. All rights reserved.
* @license For full copyright and license information view LICENSE file distributed with this source code.
*/
declare(strict_types=1);

namespace EzSystems\PlatformHttpCacheBundle\EventSubscriber\CachePurge;

use eZ\Publish\API\Repository\Events\Content\CopyContentEvent;
use eZ\Publish\API\Repository\Events\Content\CreateContentDraftEvent;
use eZ\Publish\API\Repository\Events\Content\DeleteContentEvent;
use eZ\Publish\API\Repository\Events\Content\DeleteVersionEvent;
use eZ\Publish\API\Repository\Events\Content\HideContentEvent;
use eZ\Publish\API\Repository\Events\Content\PublishVersionEvent;
use eZ\Publish\API\Repository\Events\Content\RevealContentEvent;
use eZ\Publish\API\Repository\Events\Content\UpdateContentEvent;
use eZ\Publish\API\Repository\Events\Content\UpdateContentMetadataEvent;

final class ContentEventsSubscriber extends AbstractSubscriber
{
public static function getSubscribedEvents(): array
{
return [
CopyContentEvent::class => 'onCopyContentEvent',
CreateContentDraftEvent::class => 'onCreateContentDraftEvent',
DeleteContentEvent::class => 'onDeleteContentEvent',
DeleteVersionEvent::class => 'onDeleteVersionEvent',
HideContentEvent::class => 'onHideContentEvent',
PublishVersionEvent::class => 'onPublishVersionEvent',
RevealContentEvent::class => 'onRevealContentEvent',
UpdateContentEvent::class => 'onUpdateContentEvent',
UpdateContentMetadataEvent::class => 'onUpdateContentMetadataEvent',
];
}

public function onCopyContentEvent(CopyContentEvent $event): void
{
$contentId = $event->getContentInfo()->id;
$parentLocationId = $event->getDestinationLocationCreateStruct()->parentLocationId;

$this->purgeClient->purge([
'content-' . $contentId,
'location-' . $parentLocationId,
'path-' . $parentLocationId,
]);
}

public function onCreateContentDraftEvent(CreateContentDraftEvent $event): void
{
$contentId = $event->getContentInfo()->id;

$this->purgeClient->purge([
'content-versions-' . $contentId,
]);
}

public function onDeleteContentEvent(DeleteContentEvent $event): void
{
$contentId = $event->getContentInfo()->id;

$tags = $this->getContentTags($contentId);

foreach ($event->getLocations() as $locationId) {
$tags[] = 'path-' . $locationId;
}

$this->purgeClient->purge($tags);
}

public function onDeleteVersionEvent(DeleteVersionEvent $event): void
{
$contentId = $event->getVersionInfo()->getContentInfo()->id;

$this->purgeClient->purge([
'delete-versions-' . $contentId,
]);
}

public function onHideContentEvent(HideContentEvent $event): void
{
$contentId = $event->getContentInfo()->id;

$tags = array_merge(
$this->getContentTags($contentId),
$this->getContentLocationsTags($contentId)
);

$this->purgeClient->purge($tags);
}

public function onPublishVersionEvent(PublishVersionEvent $event): void
{
$contentId = $event->getContent()->getVersionInfo()->getContentInfo()->id;

$tags = array_merge(
$this->getContentTags($contentId),
$this->getContentLocationsTags($contentId)
);

$this->purgeClient->purge($tags);
}

public function onRevealContentEvent(RevealContentEvent $event): void
{
$contentId = $event->getContentInfo()->id;

$tags = array_merge(
$this->getContentTags($contentId),
$this->getContentLocationsTags($contentId)
);

$this->purgeClient->purge($tags);
}

public function onUpdateContentEvent(UpdateContentEvent $event): void
{
$contentId = $event->getContent()->getVersionInfo()->getContentInfo()->id;

$this->purgeClient->purge([
'content-versions-' . $contentId,
]);
}

public function onUpdateContentMetadataEvent(UpdateContentMetadataEvent $event): void
{
$contentId = $event->getContent()->getVersionInfo()->getContentInfo()->id;

$this->purgeClient->purge(
$this->getContentTags($contentId)
);
}
}
87 changes: 87 additions & 0 deletions src/EventSubscriber/CachePurge/ContentTypeEventsSubscriber.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<?php

/**
* @copyright Copyright (C) eZ Systems AS. All rights reserved.
* @license For full copyright and license information view LICENSE file distributed with this source code.
*/
declare(strict_types=1);

namespace EzSystems\PlatformHttpCacheBundle\EventSubscriber\CachePurge;

use eZ\Publish\API\Repository\Events\ContentType\AssignContentTypeGroupEvent;
use eZ\Publish\API\Repository\Events\ContentType\DeleteContentTypeEvent;
use eZ\Publish\API\Repository\Events\ContentType\DeleteContentTypeGroupEvent;
use eZ\Publish\API\Repository\Events\ContentType\PublishContentTypeDraftEvent;
use eZ\Publish\API\Repository\Events\ContentType\UnassignContentTypeGroupEvent;
use eZ\Publish\API\Repository\Events\ContentType\UpdateContentTypeGroupEvent;

final class ContentTypeEventsSubscriber extends AbstractSubscriber
{
public static function getSubscribedEvents(): array
{
return [
AssignContentTypeGroupEvent::class => 'onAssignContentTypeGroup',
DeleteContentTypeGroupEvent::class => 'onDeleteContentTypeGroup',
DeleteContentTypeEvent::class => 'onDeleteContentType',
PublishContentTypeDraftEvent::class => 'onPublishContentTypeDraft',
UnassignContentTypeGroupEvent::class => 'onUnassignContentTypeGroup',
UpdateContentTypeGroupEvent::class => 'onUpdateContentTypeGroup',
];
}

public function onAssignContentTypeGroup(AssignContentTypeGroupEvent $event): void
{
$contentTypeGroupId = $event->getContentTypeGroup()->id;

$this->purgeClient->purge([
'type-group-' . $contentTypeGroupId,
]);
}

public function onDeleteContentTypeGroup(DeleteContentTypeGroupEvent $event): void
{
$contentTypeGroupId = $event->getContentTypeGroup()->id;

$this->purgeClient->purge([
'type-group-' . $contentTypeGroupId,
]);
}

public function onDeleteContentType(DeleteContentTypeEvent $event): void
{
$contentTypeId = $event->getContentType()->id;

$this->purgeClient->purge([
'content-type-' . $contentTypeId,
'type-' . $contentTypeId,
]);
}

public function onPublishContentTypeDraft(PublishContentTypeDraftEvent $event): void
{
$contentTypeId = $event->getContentTypeDraft()->id;

$this->purgeClient->purge([
'content-type-' . $contentTypeId,
'type-' . $contentTypeId,
]);
}

public function onUnassignContentTypeGroup(UnassignContentTypeGroupEvent $event): void
{
$contentTypeGroupId = $event->getContentTypeGroup()->id;

$this->purgeClient->purge([
'type-group-' . $contentTypeGroupId,
]);
}

public function onUpdateContentTypeGroup(UpdateContentTypeGroupEvent $event): void
{
$contentTypeGroupId = $event->getContentTypeGroup()->id;

$this->purgeClient->purge([
'type-group-' . $contentTypeGroupId,
]);
}
}
Loading

0 comments on commit 416a15f

Please sign in to comment.