Commit 2083a072 authored by Artem Dmitriiev's avatar Artem Dmitriiev
Browse files

Issue #3291685: Allow to alter tags, urls that are sent for purging

parent aeb46a6c
Loading
Loading
Loading
Loading

.gitignore

0 → 100644
+1 −0
Original line number Diff line number Diff line
.idea
 No newline at end of file
+22 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\stackpath\Event;

/**
 * Class StackPathPurgerEvents.
 *
 * Contains descriptions of events for StackPath purger.
 */
final class StackPathPurgerEvents {

  /**
   * Event for altering the tags before sending for purging.
   */
  const STACK_PATH_TAGS_ALTER = 'stackpatch.tags_alter';

  /**
   * Event for altering the urls before sending for purging.
   */
  const STACK_PATH_URLS_ALTER = 'stackpatch.urls_alter';

}
+74 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\stackpath\Event;

use Drupal\Component\EventDispatcher\Event;
use Drupal\purge\Plugin\Purge\Purger\PurgerInterface;

/**
 * Class StackPathPurgerItemsAlter.
 *
 * Contains the event for altering items before sending
 * the request for purging.
 */
class StackPathPurgerItemsAlter extends Event {

  /**
   * The purger instance.
   *
   * @var \Drupal\purge\Plugin\Purge\Purger\PurgerInterface
   */
  protected $purger;

  /**
   * The list of items to invalidate (tags or urls).
   *
   * @var array
   */
  protected $items = [];

  /**
   * Constructs StackPathPurgerItemsAlter.
   *
   * @param \Drupal\purge\Plugin\Purge\Purger\PurgerInterface $purger
   * @param array $items
   */
  public function __construct(PurgerInterface $purger, array $items = []) {
    $this->purger = $purger;
    $this->items = $items;
  }

  /**
   * Gets the items to alter.
   *
   * @return array
   *   The list of items to alter (tags or urls).
   */
  public function getItems() {
    return $this->items;
  }

  /**
   * Sets the items after altering.
   *
   * @param array $items
   *
   * @return \Drupal\stackpath\Event\StackPathPurgerItemsAlter
   *   The event object.
   */
  public function setItems(array $items) {
    $this->items = $items;
    return $this;
  }

  /**
   * Gets purger.
   *
   * @return \Drupal\purge\Plugin\Purge\Purger\PurgerInterface
   *   The purger that is used to invalidate the items.
   */
  public function getPurger() {
    return $this->purger;
  }

}
+28 −4
Original line number Diff line number Diff line
@@ -2,15 +2,18 @@

namespace Drupal\stackpath\Plugin\Purge\Purger;

use Drupal\Core\Config\ConfigFactory;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\purge\Plugin\Purge\Invalidation\InvalidationInterface;
use Drupal\purge\Plugin\Purge\Purger\PurgerBase;
use Drupal\purge\Plugin\Purge\Purger\PurgerInterface;
use Drupal\stackpath\Entity\StackPathPurgerSettings;
use Drupal\stackpath\Event\StackPathPurgerEvents;
use Drupal\stackpath\Event\StackPathPurgerItemsAlter;
use Drupal\stackpath\StackPathApi;
use Exception;
use LogicException;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use UnexpectedValueException;

/**
@@ -42,6 +45,13 @@ class StackPathPurger extends PurgerBase implements PurgerInterface {
   */
  protected $factory;

  /**
   * The event dispatcher service.
   *
   * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface
   */
  protected $eventDispatcher;

  /**
   * The settings entity holding all configuration.
   *
@@ -60,14 +70,17 @@ class StackPathPurger extends PurgerBase implements PurgerInterface {
   *   The plugin implementation definition.
   * @param \Drupal\stackpath\StackPathApi $stackpath_api
   *   StackPath API service.
   * @param \Drupal\Core\Config\ConfigFactory $factory
   * @param \Drupal\Core\Config\ConfigFactoryInterface $factory
   *   Configuration factory.
   * @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher
   *   The event dispatcher.
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, StackPathApi $stackpath_api, ConfigFactory $factory) {
  public function __construct(array $configuration, $plugin_id, $plugin_definition, StackPathApi $stackpath_api, ConfigFactoryInterface $factory, EventDispatcherInterface $event_dispatcher) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->settings = $factory->get('stackpath.settings.' . $this->getId());
    $this->factory = $factory;
    $this->stackPath = $stackpath_api;
    $this->eventDispatcher = $event_dispatcher;
  }

  /**
@@ -79,7 +92,8 @@ class StackPathPurger extends PurgerBase implements PurgerInterface {
      $plugin_id,
      $plugin_definition,
      $container->get('stackpath.api'),
      $container->get('config.factory')
      $container->get('config.factory'),
      $container->get('event_dispatcher')
    );
  }

@@ -144,6 +158,11 @@ class StackPathPurger extends PurgerBase implements PurgerInterface {
      $urls[] = $url;
    }

    // Allow others to alter the list of urls to purge.
    $event = new StackPathPurgerItemsAlter($this, $urls);
    $this->eventDispatcher->dispatch($event, StackPathPurgerEvents::STACK_PATH_URLS_ALTER);
    $urls = $event->getItems();

    if (empty($urls)) {
      foreach ($invalidations as $invalidation) {
        $invalidation->setState(InvalidationInterface::FAILED);
@@ -173,6 +192,11 @@ class StackPathPurger extends PurgerBase implements PurgerInterface {
      $tags[] = $invalidation->getExpression();
    }

    // Allow others to alter the list of tags to purge.
    $event = new StackPathPurgerItemsAlter($this, $tags);
    $this->eventDispatcher->dispatch($event, StackPathPurgerEvents::STACK_PATH_TAGS_ALTER);
    $tags = $event->getItems();

    if (empty($tags)) {
      foreach ($invalidations as $invalidation) {
        $invalidation->setState(InvalidationInterface::FAILED);
+1 −1
Original line number Diff line number Diff line
@@ -2,6 +2,6 @@ name: StackPath
description: Provides purger plugin for StackPath CDN.
type: module
core: 8.x
core_version_requirement: ^8 || ^9
core_version_requirement: ^8.8 || ^9 || ^10
dependencies:
  - purge:purge