Una de las características principales de una aplicación web es la gran cantidad de link entre sus recursos. De hecho, son el pegamento que los une. Por esa razón esta vez vamos a ver algunas técnicas comunes que se utilizan al trabajar con enlaces a nivel de código en Drupa 8.
Hay dos aspectos principales cuando se habla de crear enlaces en Drupal: la URL y la etiqueta del enlace real. Entonces, crear un enlace implica un proceso de dos pasos, pero también se puede acortar en una sola llamada a través de algunos métodos que ayudan.
NOTA: Hay un nuevo artículo mucho mas completo, podeis verlo aqui: https://escueladrupal.com/blog/generacion-url-enlaces-codigo-drupal-9
La URL
En Drupal 8, una URL se representa con la clase Drupal\Core\Url, la cual tiene multitudes métodos estáticos que nos permiten crear una instancia. El mas importante seguramente sea ::fromRoute(), que nos devuelve una nueva instancia del objeto Url utilizando un nombre de ruta y los parámetros que se le pasen. Existen otros muchos métodos, por ejemplo ::fromUri().
Existen muchas opciones que se le pueden pasar a la Url cuando la creamos en el array $options, por ejemplo un array con parámetros o si la ruta sera absoluta. Para ver todas las opciones, podemos consultar la documentación en el método ::fromUri() mencionado anteriormente.
El link
Una vez tenemos el objeto Url, podemos utilizarlo para generar el link:
- Utilizando el servicio LinkGenerator (link_generator) y llamar al método generate() pasándole el texto deseado y el objeto Url que tenemos. Nos devolverá un objeto GeneratedLink el cual contiene el texto actual representando el link.
- Utilizar la clase Link para crear un array renderizable que represente el link.
Vamos a ver un ejemplo de ambos metodos:
Primero veamos el ejemplo con el servicio LinkGenerator:
$url = Url::fromRoute('mi_ruta', ['param_name' => $param_value]);
$link = \Drupal::service('link_generator')->generate('Mi link', $url);
Podemos imprimir directamente $link ya que implementa el metodo __toString().
Ahora veamos un ejemplo utilizando la clase Link:
$url = Url::fromRoute('mi_otra_ruta');
$link = Link::fromTextAndUrl('Mi Link', $url);
Ahora tenemos $link como un objeto Link del cual toRenderable() devuelve un array renderizable que podremos utilizar. A la hora de mostrarlo, realmente utilizara el servicio LinkGeneratos para transformar el link en un texto.
Para hacerlo nosotros manualmente utilizando el servicio podemos hacerlo de la siguiente manera:
$link = \Drupal::service('link_generator')->generateFromLink($linkObject);
¿Como metodo utilizar?
Como hemos visto, tenemos varias maneras de crear enlaces y representaciones de una URL, pero cuando tenemos que crear un enlace, ¿qué método deberíamos usar? Hay ventajas y desventajas para cada uno.
Cuando se trata de URL, como se mencionó, es buena idea utilizar las rutas creadas en lugar de URI. Sin embargo, si estás trabajando con datos dinámicos, como la entrada del usuario, los otros métodos son perfectamente válidos. Recomiendo revisar la clase Url en detalle ya que se usa bastante.
En cuanto a los enlaces existentes o externos, usar el servicio para generar un enlace significa que estás creando un enlace el código. Esto significa que no puede ser alterado más adelante en el proceso. Por otro lado, el uso de la clase Link encaja muy bien con el razonamiento de los arrays renderizables de preparar la informacion y experar al ultimo momento para mostrarla.
Me metí en la aventura de Drupal con la versión 6, y aquí estoy, 10 años después, escribiendo articulos y haciendo videos sobre Drupal, quien me lo iba a decir. Aunque he probado otros framworks y cms, me quedo con Drupal de lejos, pero Symfony y Django estan entre mis favoritos. Aficionado a la montaña, la bicicleta, y el comer, de eso que no falte.