TRUE, 'multiple' => FALSE, 'default_value' => NULL, ]; // Annotation classes extract data from passed annotation classes directly // used in the classes they pass to. foreach (['label', 'description'] as $key) { // @todo Remove this workaround in https://www.drupal.org/node/2362727. if (isset($values[$key]) && $values[$key] instanceof Translation) { $values[$key] = (string) $values[$key]->get(); } else { $values[$key] = NULL; } } if (isset($values['class']) && !in_array('Drupal\Core\Plugin\Context\ContextDefinitionInterface', class_implements($values['class']))) { throw new \Exception('ContextDefinition class must implement \Drupal\Core\Plugin\Context\ContextDefinitionInterface.'); } $class = $this->getDefinitionClass($values); $this->definition = new $class($values['value'], $values['label'], $values['required'], $values['multiple'], $values['description'], $values['default_value']); if (isset($values['constraints'])) { foreach ($values['constraints'] as $constraint_name => $options) { $this->definition->addConstraint($constraint_name, $options); } } } /** * Determines the context definition class to use. * * If the annotation specifies a specific context definition class, we use * that. Otherwise, we use \Drupal\Core\Plugin\Context\EntityContextDefinition * if the data type starts with 'entity:', since it contains specialized logic * specific to entities. Otherwise, we fall back to the generic * \Drupal\Core\Plugin\Context\ContextDefinition class. * * @param array $values * The annotation values. * * @return string * The fully-qualified name of the context definition class. */ protected function getDefinitionClass(array $values) { if (isset($values['class'])) { return $values['class']; } if (str_starts_with($values['value'], 'entity:')) { return 'Drupal\Core\Plugin\Context\EntityContextDefinition'; } return 'Drupal\Core\Plugin\Context\ContextDefinition'; } /** * Returns the value of an annotation. * * @return \Drupal\Core\Plugin\Context\ContextDefinitionInterface */ public function get() { return $this->definition; } }