eca-1.0.x-dev/src/PluginManager/Action.php
src/PluginManager/Action.php
<?php
namespace Drupal\eca\PluginManager;
use Drupal\Core\Action\ActionManager;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\eca\Plugin\Action\ActionInterface;
/**
* Decorates the action manager to make ECA actions only available in ECA.
*
* Additionally uses list cache tags of the action config entity by default,
* because action config entities are used as pre-configured actions.
*/
class Action extends ActionManager {
/**
* The action manager that is being decorated by this class.
*
* @var \Drupal\Core\Action\ActionManager
*/
protected ActionManager $decoratedManager;
/**
* The entity type manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected EntityTypeManagerInterface $entityTypeManager;
/**
* Get the service instance of this class.
*
* @return \Drupal\eca\PluginManager\Action
* The service instance.
*/
public static function get(): Action {
return \Drupal::service('plugin.manager.eca.action');
}
/**
* Get the action manager that is being decorated by this class.
*
* @return \Drupal\Core\Action\ActionManager
* The manager being decorated.
*/
public function getDecoratedActionManager(): ActionManager {
return $this->decoratedManager;
}
/**
* Set the action manager that is being decorated by this class.
*
* @param \Drupal\Core\Action\ActionManager $manager
* The manager being decorated.
*/
public function setDecoratedActionManager(ActionManager $manager): void {
$this->decoratedManager = $manager;
}
/**
* Set the entity type manager.
*
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* The entity type manager.
*/
public function setEntityTypeManager(EntityTypeManagerInterface $entity_type_manager): void {
$this->entityTypeManager = $entity_type_manager;
}
/**
* Get the entity type manager.
*
* @return \Drupal\Core\Entity\EntityTypeManagerInterface
* The entity type manager.
*/
protected function getEntityTypeManager(): EntityTypeManagerInterface {
if (!isset($this->entityTypeManager)) {
// @codingStandardsIgnoreLine @phpstan-ignore-next-line
$this->entityTypeManager = \Drupal::entityTypeManager();
}
return $this->entityTypeManager;
}
/**
* {@inheritdoc}
*/
public function getModuleHandler() {
return $this->decoratedManager->getModuleHandler();
}
/**
* {@inheritdoc}
*/
public function setCacheBackend(CacheBackendInterface $cache_backend, $cache_key, array $cache_tags = []): void {
if (empty($cache_tags)) {
// By default, use the cache tags of the action entity type. This makes
// sure, that newly added pre-configured actions are available.
$cache_tags = $this->getEntityTypeManager()->getDefinition('action')->getListCacheTags();
}
if (isset($this->decoratedManager)) {
$this->decoratedManager->setCacheBackend($cache_backend, $cache_key, $cache_tags);
}
parent::setCacheBackend($cache_backend, $cache_key, $cache_tags);
}
/**
* {@inheritdoc}
*/
public function getDefinitions() {
$this->definitions = $this->filterEcaDefinitions($this->decoratedManager->getDefinitions());
return $this->definitions;
}
/**
* {@inheritdoc}
*/
public function getDefinition($plugin_id, $exception_on_invalid = TRUE) {
return $this->decoratedManager->getDefinition($plugin_id, $exception_on_invalid);
}
/**
* {@inheritdoc}
*/
public function hasDefinition($plugin_id) {
return $this->decoratedManager->hasDefinition($plugin_id);
}
/**
* {@inheritdoc}
*/
public function clearCachedDefinitions(): void {
$this->decoratedManager->clearCachedDefinitions();
parent::clearCachedDefinitions();
}
/**
* {@inheritdoc}
*/
public function useCaches($use_caches = FALSE): void {
$this->decoratedManager->useCaches($use_caches);
parent::useCaches($use_caches);
}
/**
* {@inheritdoc}
*/
public function processDefinition(&$definition, $plugin_id): void {
$this->decoratedManager->processDefinition($definition, $plugin_id);
}
/**
* {@inheritdoc}
*/
public function getCacheContexts() {
return $this->decoratedManager->getCacheContexts();
}
/**
* {@inheritdoc}
*/
public function getCacheTags() {
return $this->decoratedManager->getCacheTags();
}
/**
* {@inheritdoc}
*/
public function getCacheMaxAge() {
return $this->decoratedManager->getCacheMaxAge();
}
/**
* {@inheritdoc}
*/
public function createInstance($plugin_id, array $configuration = []) {
return $this->decoratedManager->createInstance($plugin_id, $configuration);
}
/**
* {@inheritdoc}
*/
public function getInstance(array $options) {
return $this->decoratedManager->getInstance($options);
}
/**
* Removes ECA action definition.
*
* @param array $definitions
* The definitions to filter.
*/
protected function filterEcaDefinitions(array $definitions): array {
return array_filter($definitions, static function ($definition) {
if ($class = ($definition['class'] ?? NULL)) {
if (is_a($class, ActionInterface::class, TRUE)) {
return $class::externallyAvailable();
}
}
return TRUE;
});
}
}
