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(); } /**