diff --git a/core/lib/Drupal/Component/Plugin/Discovery/StaticDiscoveryDecorator.php b/core/lib/Drupal/Component/Plugin/Discovery/StaticDiscoveryDecorator.php index 38e07a2..c01c222 100644 --- a/core/lib/Drupal/Component/Plugin/Discovery/StaticDiscoveryDecorator.php +++ b/core/lib/Drupal/Component/Plugin/Discovery/StaticDiscoveryDecorator.php @@ -20,20 +20,34 @@ class StaticDiscoveryDecorator extends StaticDiscovery { protected $decorated; /** + * A callback or closure used for registering additional definitions. + * + * @var \Callable + */ + protected $registerDefinitions; + + /** * Constructs a \Drupal\Component\Plugin\Discovery\StaticDiscoveryDecorator object. * * @param \Drupal\Component\Plugin\Discovery\DiscoveryInterface $decorated * The discovery object that is being decorated. + * @param \Callable $registerDefinitions + * (optional) A callback or closure used for registering additional + * definitions. */ - public function __construct(DiscoveryInterface $decorated) { + public function __construct(DiscoveryInterface $decorated, $registerDefinitions = NULL) { $this->decorated = $decorated; + $this->registerDefinitions = $registerDefinitions; } /** * Implements Drupal\Component\Plugin\Discovery\DiscoveryInterface::getDefinition(). */ public function getDefinition($base_plugin_id) { - $this->definitions = $this->definitions += $this->decorated->getDefinitions(); + if (isset($this->registerDefinitions)) { + call_user_func($this->registerDefinitions, $this); + } + $this->definitions += $this->decorated->getDefinitions(); return parent::getDefinition($base_plugin_id); } @@ -41,7 +55,10 @@ public function getDefinition($base_plugin_id) { * Implements Drupal\Component\Plugin\Discovery\DiscoveryInterface::getDefinitions(). */ public function getDefinitions() { - $this->definitions = $this->definitions += $this->decorated->getDefinitions(); + if (isset($this->registerDefinitions)) { + call_user_func($this->registerDefinitions, $this); + } + $this->definitions += $this->decorated->getDefinitions(); return parent::getDefinitions(); } diff --git a/core/lib/Drupal/Core/TypedData/Type/Email.php b/core/lib/Drupal/Core/TypedData/Type/Email.php index d018e28..314f8f5 100644 --- a/core/lib/Drupal/Core/TypedData/Type/Email.php +++ b/core/lib/Drupal/Core/TypedData/Type/Email.php @@ -14,14 +14,4 @@ */ class Email extends String { - /** - * Implements \Drupal\Core\TypedData\TypedDataInterface::validate(). - */ - public function validate() { - if (filter_var($this->value, FILTER_VALIDATE_EMAIL)) { - return parent::validate(); - } - return FALSE; - } - } diff --git a/core/lib/Drupal/Core/Validation/ConstraintManager.php b/core/lib/Drupal/Core/Validation/ConstraintManager.php index 1458f72..3a88d97 100644 --- a/core/lib/Drupal/Core/Validation/ConstraintManager.php +++ b/core/lib/Drupal/Core/Validation/ConstraintManager.php @@ -36,14 +36,12 @@ */ class ConstraintManager extends PluginManagerBase { - protected $definitions = array(); - /** * Overrides \Drupal\Component\Plugin\PluginManagerBase::__construct(). */ public function __construct() { $this->discovery = new AnnotatedClassDiscovery('Validation', 'Constraint'); - $this->discovery = new StaticDiscoveryDecorator($this->discovery); + $this->discovery = new StaticDiscoveryDecorator($this->discovery, array($this, 'registerDefinitions')); $this->discovery = new DerivativeDiscoveryDecorator($this->discovery); $this->discovery = new ProcessDecorator($this->discovery, array($this, 'processDefinition')); $this->discovery = new AlterDecorator($this->discovery, 'validation_constraint'); @@ -54,50 +52,37 @@ public function __construct() { $this->factory = new DefaultFactory($this); } - protected function registerDefinitions() { - // Add in definitions for constraints shipped with Symfony. - $this->discovery->setDefinition('Null', array( + /** + * Callback for registering definitions for constraints shipped with Symfony. + * + * @see ConstraintManager::__construct() + */ + public function registerDefinitions(StaticDiscoveryDecorator $discovery) { + $discovery->setDefinition('Null', array( 'label' => t('Null'), 'class' => '\Symfony\Component\Validator\Constraints\Null', 'type' => FALSE, )); - $this->discovery->setDefinition('NotNull', array( + $discovery->setDefinition('NotNull', array( 'label' => t('Not null'), 'class' => '\Symfony\Component\Validator\Constraints\NotNull', 'type' => FALSE, )); - $this->discovery->setDefinition('Blank', array( + $discovery->setDefinition('Blank', array( 'label' => t('Blank'), 'class' => '\Symfony\Component\Validator\Constraints\Blank', 'type' => FALSE, )); - $this->discovery->setDefinition('NotBlank', array( + $discovery->setDefinition('NotBlank', array( 'label' => t('Not blank'), 'class' => '\Symfony\Component\Validator\Constraints\NotBlank', 'type' => FALSE, )); - } - - /** - * Implements Drupal\Component\Plugin\PluginManagerInterface::getDefinition(). - */ - public function getDefinition($plugin_id) { - if (!$this->definitions) { - $this->registerDefinitions(); - $this->definitions = $this->discovery->getDefinitions(); - } - return $this->definitions[$plugin_id]; - } - - /** - * Implements Drupal\Component\Plugin\PluginManagerInterface::getDefinitions(). - */ - public function getDefinitions() { - if (!$this->definitions) { - $this->registerDefinitions(); - $this->definitions = $this->discovery->getDefinitions(); - } - return $this->definitions; + $discovery->setDefinition('Email', array( + 'label' => t('E-mail'), + 'class' => '\Symfony\Component\Validator\Constraints\Email', + 'type' => array('string'), + )); } /** diff --git a/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataTest.php b/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataTest.php index 61f2546..a401183 100644 --- a/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataTest.php @@ -165,16 +165,18 @@ public function testGetAndSet() { // Email type. $value = $this->randomString(); - $wrapper = $this->createTypedData(array('type' => 'email'), $value); - $this->assertIdentical($wrapper->getValue(), $value, 'E-mail value was fetched.'); - + $typed_data = $this->createTypedData(array('type' => 'email'), $value); + $this->assertIdentical($typed_data->getValue(), $value, 'E-mail value was fetched.'); $new_value = 'test@example.com'; - $wrapper->setValue($new_value); - $this->assertIdentical($wrapper->getValue(), $new_value, 'E-mail value was changed.'); - $this->assertTrue(is_string($wrapper->getString()), 'E-mail value was converted to string'); - - $wrapper->setValue(NULL); - $this->assertNull($wrapper->getValue(), 'E-mail wrapper is null-able.'); + $typed_data->setValue($new_value); + $this->assertIdentical($typed_data->getValue(), $new_value, 'E-mail value was changed.'); + $this->assertTrue(is_string($typed_data->getString()), 'E-mail value was converted to string'); + $this->assertEqual($typed_data->validate()->count(), 0); + $typed_data->setValue(NULL); + $this->assertNull($typed_data->getValue(), 'E-mail wrapper is null-able.'); + $this->assertEqual($typed_data->validate()->count(), 0); + $typed_data->setValue('invalidATexample.com'); + $this->assertEqual($typed_data->validate()->count(), 1, 'Validation detected invalid value.'); // Binary type. $typed_data = $this->createTypedData(array('type' => 'binary'), $files[0]->uri); diff --git a/core/modules/system/system.module b/core/modules/system/system.module index 106ef14..e280477 100644 --- a/core/modules/system/system.module +++ b/core/modules/system/system.module @@ -2224,6 +2224,7 @@ function system_data_type_info() { 'label' => t('Email'), 'class' => '\Drupal\Core\TypedData\Type\Email', 'primitive type' => Primitive::STRING, + 'constraints' => array('Email' => array()), ), 'binary' => array( 'label' => t('Binary'),