You are here

class ListUsageController in Entity Usage 8

Same name and namespace in other branches
  1. 8.4 src/Controller/ListUsageController.php \Drupal\entity_usage\Controller\ListUsageController
  2. 8.2 src/Controller/ListUsageController.php \Drupal\entity_usage\Controller\ListUsageController
  3. 8.3 src/Controller/ListUsageController.php \Drupal\entity_usage\Controller\ListUsageController

Controller for our pages.

Hierarchy

Expanded class hierarchy of ListUsageController

File

src/Controller/ListUsageController.php, line 16

Namespace

Drupal\entity_usage\Controller
View source
class ListUsageController extends ControllerBase {

  /**
   * The EntityTypeManager service.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * The EntityUsage service.
   *
   * @var \Drupal\entity_usage\EntityUsageInterface
   */
  protected $entityUsage;

  /**
   * ListUsageController constructor.
   *
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   The EntityManager service.
   * @param \Drupal\entity_usage\EntityUsageInterface $entity_usage
   *   The EntityUsage service.
   */
  public function __construct(EntityTypeManagerInterface $entity_type_manager, EntityUsageInterface $entity_usage) {
    $this->entityTypeManager = $entity_type_manager;
    $this->entityUsage = $entity_usage;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static($container
      ->get('entity_type.manager'), $container
      ->get('entity_usage.usage'));
  }

  /**
   * Lists the usage of a given entity.
   *
   * @param string $type
   *   The entity type.
   * @param int $id
   *   The entity ID.
   *
   * @return array
   *   The page build to be rendered.
   */
  public function listUsagePage($type, $id) {
    $entity_types = array_keys($this->entityTypeManager
      ->getDefinitions());
    if (!is_string($type) || !is_numeric($id) || !in_array($type, $entity_types)) {
      throw new NotFoundHttpException();
    }
    $entity = $this->entityTypeManager
      ->getStorage($type)
      ->load($id);
    if ($entity) {
      $usages = $this->entityUsage
        ->listUsage($entity, TRUE);
      if (empty($usages)) {

        // Entity exists but not used.
        $build = [
          '#markup' => $this
            ->t('There are no recorded usages for entity of type: @type with id: @id', [
            '@type' => $type,
            '@id' => $id,
          ]),
        ];
      }
      else {

        // Entity is being used.
        $header = [
          $this
            ->t('Referencing entity'),
          $this
            ->t('Referencing entity type'),
          $this
            ->t('Referencing method'),
          $this
            ->t('Count'),
        ];
        $rows = [];
        foreach ($usages as $method => $method_usages) {
          foreach ($method_usages as $re_type => $type_usages) {
            foreach ($type_usages as $re_id => $count) {
              $referencing_entity = $this->entityTypeManager
                ->getStorage($re_type)
                ->load($re_id);
              if ($referencing_entity) {
                $link = $this
                  ->getReferencingEntityLink($referencing_entity);
                $rows[] = [
                  $link,
                  $re_type,
                  $method,
                  $count,
                ];
              }
            }
          }
        }
        $build = [
          '#theme' => 'table',
          '#rows' => $rows,
          '#header' => $header,
        ];
      }
    }
    else {

      // Non-existing entity in database.
      $build = [
        '#markup' => $this
          ->t('Could not find the entity of type: @type with id: @id', [
          '@type' => $type,
          '@id' => $id,
        ]),
      ];
    }
    return $build;
  }

  /**
   * Title page callback.
   *
   * @param string $type
   *   The entity type.
   * @param int $id
   *   The entity id.
   *
   * @return string
   *   The title to be used on this page.
   */
  public function getTitle($type, $id) {
    $entity = $this->entityTypeManager
      ->getStorage($type)
      ->load($id);
    if ($entity) {
      return $this
        ->t('Entity usage information for %entity_label', [
        '%entity_label' => $entity
          ->label(),
      ]);
    }
    else {
      return $this
        ->t('Entity Usage List');
    }
  }

  /**
   * Retrieve a link to the referencing entity.
   *
   * @param \Drupal\Core\Entity\ContentEntityInterface $referencing_entity
   *   The fully-loaded referencing entity.
   * @param string|null $text
   *   (optional) The link text for the anchor tag as a translated string.
   *   If NULL, it will use the entity's label. Defaults to NULL.
   *
   * @return \Drupal\Core\Link|string
   *   A link to the entity, or its non-linked label, in case it was impossible
   *   to correctly build a link.
   *   Note that Paragraph entities are specially treated. This function will
   *   return the link to its parent entity, relying on the fact that paragraphs
   *   have only one single parent and don't have canonical template.
   */
  private function getReferencingEntityLink(ContentEntityInterface $referencing_entity, $text = NULL) {
    $entity_label = $referencing_entity
      ->access('view label') ? $referencing_entity
      ->label() : $this
      ->t('- Restricted access -');
    if ($referencing_entity
      ->hasLinkTemplate('canonical')) {
      $link_text = $text ?: $entity_label;

      // Prevent 404s by exposing the text unlinked if the user has no access
      // to view the entity.
      return $referencing_entity
        ->access('view') ? $referencing_entity
        ->toLink($link_text) : $link_text;
    }

    // Treat paragraph entities in a special manner. Once the current paragraphs
    // implementation does not support reusing paragraphs, it is safe to
    // consider that each paragraph entity is attached to only one parent
    // entity. For this reason we will use the link to the parent's entity,
    // adding a note that the parent uses this entity through a paragraph.
    // @see #2414865 and related issues for more info.
    if ($referencing_entity
      ->getEntityTypeId() == 'paragraph' && ($parent = $referencing_entity
      ->getParentEntity())) {
      return $this
        ->getReferencingEntityLink($parent, $entity_label);
    }

    // As a fallback just return a non-linked label.
    return $entity_label;
  }

  /**
   * Checks access based on whether the user can view the current entity.
   *
   * @param string $type
   *   The entity type.
   * @param int $id
   *   The entity ID.
   *
   * @return \Drupal\Core\Access\AccessResultInterface
   *   The access result.
   */
  public function checkAccess($type, $id) {
    $entity = $this->entityTypeManager
      ->getStorage($type)
      ->load($id);
    if (!$entity || !$entity
      ->access('view')) {
      return AccessResult::forbidden();
    }
    return AccessResult::allowed();
  }

}

Members

Namesort descending Modifiers Type Description Overrides
ControllerBase::$configFactory protected property The configuration factory.
ControllerBase::$currentUser protected property The current user service. 1
ControllerBase::$entityFormBuilder protected property The entity form builder.
ControllerBase::$entityManager protected property The entity manager.
ControllerBase::$formBuilder protected property The form builder. 2
ControllerBase::$keyValue protected property The key-value storage. 1
ControllerBase::$languageManager protected property The language manager. 1
ControllerBase::$moduleHandler protected property The module handler. 2
ControllerBase::$stateService protected property The state service.
ControllerBase::cache protected function Returns the requested cache bin.
ControllerBase::config protected function Retrieves a configuration object.
ControllerBase::container private function Returns the service container.
ControllerBase::currentUser protected function Returns the current user. 1
ControllerBase::entityFormBuilder protected function Retrieves the entity form builder.
ControllerBase::entityManager Deprecated protected function Retrieves the entity manager service.
ControllerBase::entityTypeManager protected function Retrieves the entity type manager.
ControllerBase::formBuilder protected function Returns the form builder service. 2
ControllerBase::keyValue protected function Returns a key/value storage collection. 1
ControllerBase::languageManager protected function Returns the language manager service. 1
ControllerBase::moduleHandler protected function Returns the module handler. 2
ControllerBase::redirect protected function Returns a redirect response object for the specified route. Overrides UrlGeneratorTrait::redirect
ControllerBase::state protected function Returns the state storage service.
LinkGeneratorTrait::$linkGenerator protected property The link generator. 1
LinkGeneratorTrait::getLinkGenerator Deprecated protected function Returns the link generator.
LinkGeneratorTrait::l Deprecated protected function Renders a link to a route given a route name and its parameters.
LinkGeneratorTrait::setLinkGenerator Deprecated public function Sets the link generator service.
ListUsageController::$entityTypeManager protected property The EntityTypeManager service. Overrides ControllerBase::$entityTypeManager
ListUsageController::$entityUsage protected property The EntityUsage service.
ListUsageController::checkAccess public function Checks access based on whether the user can view the current entity.
ListUsageController::create public static function Instantiates a new instance of this class. Overrides ControllerBase::create
ListUsageController::getReferencingEntityLink private function Retrieve a link to the referencing entity.
ListUsageController::getTitle public function Title page callback.
ListUsageController::listUsagePage public function Lists the usage of a given entity.
ListUsageController::__construct public function ListUsageController constructor.
LoggerChannelTrait::$loggerFactory protected property The logger channel factory service.
LoggerChannelTrait::getLogger protected function Gets the logger for a specific channel.
LoggerChannelTrait::setLoggerFactory public function Injects the logger channel factory.
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
RedirectDestinationTrait::$redirectDestination protected property The redirect destination service. 1
RedirectDestinationTrait::getDestinationArray protected function Prepares a 'destination' URL query parameter for use with \Drupal\Core\Url.
RedirectDestinationTrait::getRedirectDestination protected function Returns the redirect destination service.
RedirectDestinationTrait::setRedirectDestination public function Sets the redirect destination service.
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.
UrlGeneratorTrait::$urlGenerator protected property The url generator.
UrlGeneratorTrait::getUrlGenerator Deprecated protected function Returns the URL generator service.
UrlGeneratorTrait::setUrlGenerator Deprecated public function Sets the URL generator service.
UrlGeneratorTrait::url Deprecated protected function Generates a URL or path for a specific route based on the given parameters.