open-orchestra/open-orchestra-media-admin-bundle

View on GitHub
MediaAdminBundle/EventSubscriber/MediaCacheInvalidateSubscriber.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace OpenOrchestra\MediaAdminBundle\EventSubscriber;

use OpenOrchestra\Media\Model\MediaInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use OpenOrchestra\MediaAdmin\MediaEvents;
use OpenOrchestra\MediaAdmin\Event\MediaEvent;
use OpenOrchestra\DisplayBundle\Manager\CacheableManager;
use OpenOrchestra\BaseBundle\Manager\TagManager;
use OpenOrchestra\ModelInterface\Model\NodeInterface;
use OpenOrchestra\ModelInterface\Model\ContentInterface;
use OpenOrchestra\ModelInterface\Model\ContentTypeInterface;

/**
 * Class MediaCacheInvalidateSubscriber
 */
class MediaCacheInvalidateSubscriber implements EventSubscriberInterface
{
    protected $cacheableManager;
    protected $tagManager;

    /**
     * @param CacheableManager        $cacheableManager
     * @param TagManager              $tagManager
     */
    public function __construct(
        CacheableManager $cacheableManager,
        TagManager $tagManager
    ) {
        $this->cacheableManager = $cacheableManager;
        $this->tagManager = $tagManager;
    }

    /**
     * Invalidate cache on $mediaId
     * 
     * @param MediaInterface $media
     */
    protected function invalidate($media)
    {
        $tags = array($this->tagManager->formatMediaIdTag($media->getId()));

        $nodeUsage = $media->getUseReferences(NodeInterface::ENTITY_TYPE);

        foreach ($nodeUsage as $nodeId) {
            $tags[] = $this->tagManager->formatNodeIdTag($nodeId);
        }

        $contentUsage = $media->getUseReferences(ContentInterface::ENTITY_TYPE);
        foreach ($contentUsage as $contentId) {
            $tags[] = $this->tagManager->formatContentIdTag($contentId);
        }

        $contentTypeUsage = $media->getUseReferences(ContentTypeInterface::ENTITY_TYPE);
        foreach ($contentTypeUsage as $contentTypeId) {
            $tags[] = $this->tagManager->formatContentTypeTag($contentTypeId);
        }

        $this->cacheableManager->invalidateTags($tags);
    }

    /**
     * Triggered when a media is cropped
     * 
     * @param MediaEvent $event
     */
    public function updateMedia(MediaEvent $event)
    {
        $this->invalidate($event->getMedia());
    }

    /**
     * Triggered when a media is deleted
     * 
     * @param MediaEvent $event
     */
    public function deleteMedia(MediaEvent $event)
    {
        $this->invalidate($event->getMedia());
    }

    /**
     * @return array The event names to listen to
     */
    public static function getSubscribedEvents()
    {
        return array(
            MediaEvents::MEDIA_UPDATE => 'updateMedia',
            MediaEvents::MEDIA_DELETE => 'deleteMedia'
       );
    }
}