Further Drupal 8.6.4 changes. Some core files were not committed before a commit...
[yaffs-website] / web / core / modules / node / src / Controller / NodeViewController.php
1 <?php
2
3 namespace Drupal\node\Controller;
4
5 use Drupal\Core\Entity\EntityInterface;
6 use Drupal\Core\Entity\Controller\EntityViewController;
7 use Drupal\Core\Entity\EntityManagerInterface;
8 use Drupal\Core\Render\RendererInterface;
9 use Drupal\Core\Session\AccountInterface;
10 use Symfony\Component\DependencyInjection\ContainerInterface;
11
12 /**
13  * Defines a controller to render a single node.
14  */
15 class NodeViewController extends EntityViewController {
16
17   /**
18    * The current user.
19    *
20    * @var \Drupal\Core\Session\AccountInterface
21    */
22   protected $currentUser;
23
24   /**
25    * Creates an NodeViewController object.
26    *
27    * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
28    *   The entity manager.
29    * @param \Drupal\Core\Render\RendererInterface $renderer
30    *   The renderer service.
31    * @param \Drupal\Core\Session\AccountInterface $current_user
32    *   The current user. For backwards compatibility this is optional, however
33    *   this will be removed before Drupal 9.0.0.
34    */
35   public function __construct(EntityManagerInterface $entity_manager, RendererInterface $renderer, AccountInterface $current_user = NULL) {
36     parent::__construct($entity_manager, $renderer);
37     $this->currentUser = $current_user ?: \Drupal::currentUser();
38   }
39
40   /**
41    * {@inheritdoc}
42    */
43   public static function create(ContainerInterface $container) {
44     return new static(
45       $container->get('entity.manager'),
46       $container->get('renderer'),
47       $container->get('current_user')
48     );
49   }
50
51   /**
52    * {@inheritdoc}
53    */
54   public function view(EntityInterface $node, $view_mode = 'full', $langcode = NULL) {
55     $build = parent::view($node, $view_mode, $langcode);
56
57     foreach ($node->uriRelationships() as $rel) {
58       $url = $node->toUrl($rel);
59       // Add link relationships if the user is authenticated or if the anonymous
60       // user has access. Access checking must be done for anonymous users to
61       // avoid traffic to inaccessible pages from web crawlers. For
62       // authenticated users, showing the links in HTML head does not impact
63       // user experience or security, since the routes are access checked when
64       // visited and only visible via view source. This prevents doing
65       // potentially expensive and hard to cache access checks on every request.
66       // This means that the page will vary by user.permissions. We also rely on
67       // the access checking fallback to ensure the correct cacheability
68       // metadata if we have to check access.
69       if ($this->currentUser->isAuthenticated() || $url->access($this->currentUser)) {
70         // Set the node path as the canonical URL to prevent duplicate content.
71         $build['#attached']['html_head_link'][] = [
72           [
73             'rel' => $rel,
74             'href' => $url->toString(),
75           ],
76           TRUE,
77         ];
78       }
79
80       if ($rel == 'canonical') {
81         // Set the non-aliased canonical path as a default shortlink.
82         $build['#attached']['html_head_link'][] = [
83           [
84             'rel' => 'shortlink',
85             'href' => $url->setOption('alias', TRUE)->toString(),
86           ],
87           TRUE,
88         ];
89       }
90     }
91
92     // Given this varies by $this->currentUser->isAuthenticated(), add a cache
93     // context based on the anonymous role.
94     $build['#cache']['contexts'][] = 'user.roles:anonymous';
95
96     return $build;
97   }
98
99   /**
100    * The _title_callback for the page that renders a single node.
101    *
102    * @param \Drupal\Core\Entity\EntityInterface $node
103    *   The current node.
104    *
105    * @return string
106    *   The page title.
107    */
108   public function title(EntityInterface $node) {
109     return $this->entityManager->getTranslationFromContext($node)->label();
110   }
111
112 }