Principes
Pour afficher un noeud, il faut commencer par la charger comme décrit dans l'article "Charger des entités depuis un contrôleur". Ensuite on génère une instance de la classe view builder avec la méthode getViewBuilder() de la classe entityTypeManager puis on utilise la méthode view("entity", "view_mode" et "lang_code").
$entity=\Drupal::entityTypeManager()->getStorage('type_entité')->load(identifiant_entité);
$view_mode="default"
$render = \Drupal::entityTypeManager()->getViewBuilder('node')->view($entity, $view_mode);
L'arguement "view_mode" doit contenir un mode d'affichage. Par défaut, les articles proposent les mode default et teaser mais vous pouvez en créer d'autres.
L'arguement "lang_code" indique la langue d'affichage du noeud. S'il n'est pas indiqué, ce sera la langue par défaut du site qui sera utilisée.
Exemple
Dans cet exemple, on imagine que vous avez un squelette de module avec une route, un contrôleur et un gabarit. Si vous ne savez pas comment faire, vous devez lire les articles "créer un squelette de module avec drush" et "lier un gabarit à une route qui pointe vers un contrôleur". L'objectif va être de charger un article et l'afficher avec le mode teaser
Dans le contrôleur :
$article=\Drupal::entityTypeManager()->getStorage('article')->load($id_article);
$view_mode="Teaser";
$variable['article'] = \Drupal::entityTypeManager()->getViewBuilder('node')->view($article, $view_mode);
Pour trouver le nom des modes d'affichage, vous pouvez aller dans gérer l'affichage d'un type de contenu. Vous pouvez aussi exporter vos config avec drush (drush config:export) puis aller dans votre dossier de synchronisation qui s'appelle config/sync. Ce dossier est normalement au même niveau que votre dossier web. Dans ce dossier vous trouverez un fichier core.entity.view_display.node.NOM_DU_NODE.NOM_DU_MODE_AFFICHAGE.yml par type d'affichage
Dans le template twig, il ne reste plus qu'à afficher {{$variable['article']}}