FieldStorageCreateCheckSubscriber.php

Namespace

Drupal\Core\Test\EventSubscriber

File

core/lib/Drupal/Core/Test/EventSubscriber/FieldStorageCreateCheckSubscriber.php

View source
<?php

namespace Drupal\Core\Test\EventSubscriber;

use Drupal\Core\Database\Connection;
use Drupal\Core\Database\Schema;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Entity\Sql\SqlEntityStorageInterface;
use Drupal\Core\Field\FieldStorageDefinitionEvent;
use Drupal\Core\Field\FieldStorageDefinitionEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Response subscriber to field storage events.
 *
 * In Kernel test field storages can be created without the entity schema, on
 * which the field storage is based, not being created. For database driver that
 * store the whole entity instance in a single JSON object, like the database
 * driver for MongoDB is doing, the kernel test will fail.
 *
 * @internal
 */
final class FieldStorageCreateCheckSubscriber implements EventSubscriberInterface {
    
    /**
     * The schema object for this connection.
     */
    protected Schema $schema;
    
    /**
     * Constructs the FieldStorageCreateCheckSubscriber object.
     *
     * @param \Drupal\Core\Database\Connection $connection
     *   The database connection.
     * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager
     *   The entity type manager service.
     * @param bool $throwLogicExceptionOrDeprecationWarning
     *   When the value is TRUE a LogicException will be thrown, when the value is
     *   FALSE a deprecation warning will be given. The value defaults to FALSE.
     */
    public function __construct(Connection $connection, EntityTypeManagerInterface $entityTypeManager, bool $throwLogicExceptionOrDeprecationWarning = FALSE) {
        $this->schema = $this->connection
            ->schema();
    }
    
    /**
     * Gets the subscribed events.
     *
     * @return array
     *   An array of subscribed event names.
     *
     * @see \Symfony\Component\EventDispatcher\EventSubscriberInterface::getSubscribedEvents()
     */
    public static function getSubscribedEvents() : array {
        return [
            FieldStorageDefinitionEvents::CREATE => [
                'onFieldStorageDefinitionCreateEvent',
            ],
        ];
    }
    
    /**
     * Listener method for any field storage definition create event.
     *
     * @param \Drupal\Core\Field\FieldStorageDefinitionEvent $event
     *   The field storage definition event object.
     * @param string $event_name
     *   The event name.
     */
    public function onFieldStorageDefinitionCreateEvent(FieldStorageDefinitionEvent $event, $event_name) : void {
        $entity_type_id = $event->getFieldStorageDefinition()
            ->getTargetEntityTypeId();
        if ($entity_type_id) {
            $storage = $this->entityTypeManager
                ->getStorage($entity_type_id);
            if ($storage instanceof SqlEntityStorageInterface) {
                $base_table = $storage->getTableMapping()
                    ->getBaseTable();
                if (!$this->schema
                    ->tableExists($base_table)) {
                    if ($this->throwLogicExceptionOrDeprecationWarning) {
                        throw new \LogicException(sprintf('Creating the "%s" field storage definition without the entity schema "%s" being installed is not allowed.', $event->getFieldStorageDefinition()
                            ->id(), $entity_type_id));
                    }
                    else {
                        @trigger_error('Creating the "' . $event->getFieldStorageDefinition()
                            ->id() . '" field storage definition without the entity schema "' . $entity_type_id . '" being installed is deprecated in drupal:11.2.0 and will be replaced by a LogicException in drupal:12.0.0. See https://www.drupal.org/node/3493981', E_USER_DEPRECATED);
                    }
                }
            }
        }
    }

}

Classes

Title Deprecated Summary
FieldStorageCreateCheckSubscriber Response subscriber to field storage events.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.