Creazione di link personalizzati in Drupal 11

La funzione l() è deprecata da Drupal 8 in poi, ecco come programmare un collegamento in Drupal 11.

Drupal 11 fornisce un sistema molto più robusto per creare link dinamici, localizzati, sicuri e temizzabili. Usare le classi Link e Url consente una perfetta integrazione con il tema e con i meccanismi di caching e accessibilità di Drupal.

22 July 2025

Il vecchio articolo sulla funzione l() non è più attuale, ecco quindi una versione aggiornata e riveduta per Drupal 11.


Un collegamento ipertestuale, oltre all’indirizzo di destinazione (href) e al testo di ancoraggio, può includere attributi HTML come class, id, title o rel. Scrivere un link statico in HTML è semplice, ma se si lavora a un modulo o a un tema Drupal, conviene usare gli strumenti offerti dal sistema di rendering.

Dalla versione 8 in poi, Drupal non utilizza più la funzione l(), ma si basa sull’uso di oggetti render array e oggetti Link della classe \Drupal\Core\Link, che garantiscono coerenza, sicurezza e flessibilità.

Link semplice

use Drupal\Core\Link;
use Drupal\Core\Url;

// Crea il link.
$link = Link::fromTextAndUrl(t('Testo di aggancio'), Url::fromRoute('entity.node.canonical', ['node' => $nid]));
$renderable = $link->toRenderable();

// Usa il servizio di rendering per ottenere l'HTML.
echo \Drupal::service('renderer')->renderPlain($renderable);

Link con attributi HTML

use Drupal\Core\Link;
use Drupal\Core\Url;

// Crea l'URL con attributi
$url = Url::fromRoute('entity.node.canonical', ['node' => $nid]);
$url->setOptions([
  'attributes' => [
    'class' => ['classe-css'],
    'id' => 'id-link',
    'rel' => 'nofollow',
  ],
]);

// Crea il link
$link = Link::fromTextAndUrl(t('Testo con attributi'), $url);

// Renderizza il link
echo \Drupal::service('renderer')->render($link->toRenderable());

Collegamento ad un'immagine

use Drupal\Core\Url;

// Imposta ID del nodo
$nid = 1;

// Imposta percorso del file 
$file_path = '/path/to/image.jpg';

// Costruisci l'URL del link
$url = Url::fromRoute('entity.node.canonical', ['node' => $nid]);
$url->setOptions([
  'attributes' => ['class' => ['image-link']],
]);

// Costruisci il render array del link con contenuto HTML (immagine)
$link_render_array = [
  '#type' => 'link',
  '#title' => [
    '#markup' => '<img src="' . $file_path . '" alt="Descrizione">',
  ],
  '#url' => $url,
  '#options' => [
    'html' => TRUE,
  ],
];

// Renderizza direttamente il render array
echo \Drupal::service('renderer')->render($link_render_array);

Link esterni o mailto

use Drupal\Core\Link;
use Drupal\Core\Url;

// Crea l'oggetto URL con attributi.
$url = Url::fromUri('mailto:email@example.com', [
  'attributes' => ['class' => ['email-link']],
]);

// Crea il link come oggetto Link.
$link = Link::fromTextAndUrl('Scrivici', $url);

// Rende l'output HTML del link.
echo \Drupal::service('renderer')->render($link->toRenderable());

Esempio avanzato con Media e stili immagine

// Imposta gli ID del nodo e del media
$nid = 123;
$media_id = 456;

// Carica l'entità Media
$media = Media::load($media_id);

if ($media && $media->bundle() === 'image') {
  // Carica l'immagine dal campo che la contiene
  $image_field = $media->get('field_media_image');
  if (!$image_field->isEmpty()) {
    $file = $image_field->entity;
    $uri = $file->getFileUri();

    // Definisce lo stile da usare.
    $style_url = ImageStyle::load('thumbnail')->buildUrl($uri);

    // Crea l'array renderizzabile per l'immagine.
    $image_render_array = [
      '#theme' => 'image',
      '#uri' => $style_url,
      '#alt' => 'Miniatura',
    ];

    // Crea il link.
    $url = Url::fromRoute('entity.node.canonical', ['node' => $nid], [
      'attributes' => ['class' => ['link-img']],
    ]);

    // Renderizza l'immagine in una stringa.
    $image_html = \Drupal::service('renderer')->renderPlain($image_render_array);

    // Crea il link usando la stringa come testo.
    $link = Link::fromTextAndUrl($image_html, $url);

    // Stampa il link con l'immagine.
    echo \Drupal::service('renderer')->render($link->toRenderable());
  }
}