ui_patterns-8.x-1.4/src/Plugin/Deriver/AbstractPatternsDeriver.php
src/Plugin/Deriver/AbstractPatternsDeriver.php
<?php
namespace Drupal\ui_patterns\Plugin\Deriver;
use Drupal\Component\Plugin\Derivative\DeriverBase;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\TypedData\TypedDataManager;
use Drupal\ui_patterns\Definition\PatternDefinition;
use Drupal\ui_patterns\TypedData\PatternDataDefinition;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Base class for all other UI Patterns derivers.
*
* @package Drupal\ui_patterns\Deriver
*/
abstract class AbstractPatternsDeriver extends DeriverBase implements PatternsDeriverInterface, ContainerDeriverInterface {
use StringTranslationTrait;
/**
* Typed data manager service.
*
* @var \Drupal\Core\TypedData\TypedDataManager
*/
protected $typedDataManager;
/**
* The messenger.
*
* @var \Drupal\Core\Messenger\MessengerInterface
*/
protected $messenger;
/**
* The base plugin ID.
*
* @var string
*/
protected string $basePluginId;
/**
* AbstractPatternsDeriver constructor.
*/
public function __construct(string $base_plugin_id, TypedDataManager $typed_data_manager, MessengerInterface $messenger) {
$this->basePluginId = $base_plugin_id;
$this->typedDataManager = $typed_data_manager;
$this->messenger = $messenger;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, $base_plugin_id) {
return new static(
$base_plugin_id,
$container->get('typed_data_manager'),
$container->get('messenger')
);
}
/**
* {@inheritdoc}
*/
public function getDerivativeDefinitions($base_plugin_definition) {
foreach ($this->getPatterns() as $pattern) {
$pattern->setDeriver($base_plugin_definition['deriver']);
$pattern->setClass($base_plugin_definition['class']);
$pattern->setProvider($pattern->getProvider() ?? $base_plugin_definition['provider']);
if ($this->isValidPatternDefinition($pattern)) {
$this->derivatives[$pattern->id()] = $pattern;
}
}
return $this->derivatives;
}
/**
* Get pattern data object.
*
* @param array $definition
* Pattern definition array.
*
* @return \Drupal\ui_patterns\Definition\PatternDefinition
* Pattern definition object.
*/
protected function getPatternDefinition(array $definition = []) {
return new PatternDefinition($definition);
}
/**
* Validate pattern definition.
*
* @param \Drupal\ui_patterns\Definition\PatternDefinition $definition
* Pattern definition.
*
* @return bool
* Whereas current pattern definition is valid or not.
*/
protected function isValidPatternDefinition(PatternDefinition $definition) {
$data_definition = PatternDataDefinition::create();
$violations = $this->typedDataManager->create($data_definition, $definition->toArray())->validate();
if ($violations->count()) {
/** @var \Symfony\Component\Validator\ConstraintViolation $violation */
$this->messenger->addError($this->t("Pattern ':id' is skipped because of the following validation error(s):", [':id' => $definition->id()]));
foreach ($violations as $violation) {
$message = $this->t('Validation error on ":id.:property": :message', [
':id' => $definition->id(),
':property' => $violation->getPropertyPath(),
':message' => $violation->getMessage(),
]);
$this->messenger->addError($message);
}
return FALSE;
}
return TRUE;
}
}
