DefaultContentSubscriber.php

Same filename in this branch
  1. 11.x core/modules/media/src/EventSubscriber/DefaultContentSubscriber.php
  2. 11.x core/modules/layout_builder/src/EventSubscriber/DefaultContentSubscriber.php
  3. 11.x core/modules/content_moderation/src/EventSubscriber/DefaultContentSubscriber.php
  4. 11.x core/modules/link/src/EventSubscriber/DefaultContentSubscriber.php
  5. 11.x core/modules/path/src/EventSubscriber/DefaultContentSubscriber.php
  6. 11.x core/modules/file/src/EventSubscriber/DefaultContentSubscriber.php
Same filename and directory in other branches
  1. main core/modules/media/src/EventSubscriber/DefaultContentSubscriber.php
  2. main core/modules/file/src/EventSubscriber/DefaultContentSubscriber.php
  3. main core/modules/layout_builder/src/EventSubscriber/DefaultContentSubscriber.php
  4. main core/modules/content_moderation/src/EventSubscriber/DefaultContentSubscriber.php
  5. main core/modules/link/src/EventSubscriber/DefaultContentSubscriber.php
  6. main core/modules/path/src/EventSubscriber/DefaultContentSubscriber.php

Namespace

Drupal\menu_link_content\EventSubscriber

File

core/modules/menu_link_content/src/EventSubscriber/DefaultContentSubscriber.php

View source
<?php

declare (strict_types=1);
namespace Drupal\menu_link_content\EventSubscriber;

use Drupal\Core\DefaultContent\PreExportEvent;
use Drupal\Core\Entity\EntityRepositoryInterface;
use Drupal\menu_link_content\MenuLinkContentInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\Attribute\AutowireServiceClosure;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Subscribes to default content-related events.
 *
 * @internal
 *   Event subscribers are internal.
 */
final class DefaultContentSubscriber implements EventSubscriberInterface {
  public function __construct(private readonly EntityRepositoryInterface $entityRepository, #[AutowireServiceClosure('logger.channel.default_content')] private readonly \Closure $logger) {
  }
  
  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() : array {
    return [
      PreExportEvent::class => 'preExport',
    ];
  }
  
  /**
   * Reacts before an entity is exported.
   *
   * Adds an export callback to ensure parent menu links are marked as
   * dependencies, when exporting menu link content entities.
   *
   * @param \Drupal\Core\DefaultContent\PreExportEvent $event
   *   The event object.
   */
  public function preExport(PreExportEvent $event) : void {
    if (!$event->entity instanceof MenuLinkContentInterface) {
      return;
    }
    $parentId = $event->entity
      ->getParentId();
    if (!str_starts_with($parentId, 'menu_link_content:')) {
      return;
    }
    [, $uuid] = explode(':', $parentId);
    $parent = $this->entityRepository
      ->loadEntityByUuid('menu_link_content', $uuid);
    if ($parent instanceof MenuLinkContentInterface) {
      $event->metadata
        ->addDependency($parent);
      return;
    }
    $this->getLogger()
      ->error("The parent (%parent) of menu link %uuid could not be loaded.", [
      '%parent' => $uuid,
      '%uuid' => $event->entity
        ->uuid(),
    ]);
  }
  
  /**
   * Gets the logging service.
   *
   * @return \Psr\Log\LoggerInterface
   *   The logging service.
   */
  private function getLogger() : LoggerInterface {
    return ($this->logger)();
  }

}

Classes

Title Deprecated Summary
DefaultContentSubscriber Subscribes to default content-related events.

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