From bfa2c39f1ff7877cd388a9c478d2a989e9cefa3a Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 29 Jul 2020 17:17:30 -0300 Subject: [PATCH] Skip link headers for non-canonicalizable entities (#781) * Update means of generating LinkHeader URL. ... allow for catching exceptions for entities without canonical URLs. * Coding standards... ... also, throw in the other throws declaration. * Adjust language. * Fix a stray capital... --- src/EventSubscriber/LinkHeaderSubscriber.php | 10 +++++++++- src/IslandoraUtils.php | 14 ++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/EventSubscriber/LinkHeaderSubscriber.php b/src/EventSubscriber/LinkHeaderSubscriber.php index efb0e638..a25b506c 100644 --- a/src/EventSubscriber/LinkHeaderSubscriber.php +++ b/src/EventSubscriber/LinkHeaderSubscriber.php @@ -9,6 +9,7 @@ use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\Session\AccountInterface; use Drupal\islandora\IslandoraUtils; +use Drupal\Core\Entity\Exception\UndefinedLinkTemplateException; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\Response; @@ -205,7 +206,14 @@ abstract class LinkHeaderSubscriber implements EventSubscriberInterface { // Headers are subject to an access check. if ($referencedEntity->access('view')) { - $entity_url = $this->utils->getEntityUrl($referencedEntity); + try { + $entity_url = $this->utils->getEntityUrl($referencedEntity); + } + catch (UndefinedLinkTemplateException $e) { + // Not all referencable entities can generate canonical URLs, for + // example: block entities. + continue; + } // Taxonomy terms are written out as // ; rel="tag"; title="Tag Name" diff --git a/src/IslandoraUtils.php b/src/IslandoraUtils.php index 1d337796..56422515 100644 --- a/src/IslandoraUtils.php +++ b/src/IslandoraUtils.php @@ -563,15 +563,17 @@ class IslandoraUtils { * * @return string * The entity URL. + * + * @throws \Drupal\Core\Entity\Exception\UndefinedLinkTemplateException + * Thrown if the given entity does not specify a "canonical" template. + * @throws \Drupal\Core\Entity\EntityMalformedException */ public function getEntityUrl(EntityInterface $entity) { $undefined = $this->languageManager->getLanguage('und'); - $entity_type = $entity->getEntityTypeId(); - return Url::fromRoute( - "entity.$entity_type.canonical", - [$entity_type => $entity->id()], - ['absolute' => TRUE, 'language' => $undefined] - )->toString(); + return $entity->toUrl('canonical', [ + 'absolute' => TRUE, + 'language' => $undefined, + ])->toString(); } /**