Crear enlaces y URL en Drupal
La clase Drupal\Core\Url de Drupal es una gran utilidad para generar URL y redirigir a rutas específicas. Además del método ::fromRoute() , esta clase proporciona otros métodos estáticos muy útiles. A continuación, vamos a hacer un repaso y descripción general de los métodos estáticos clave y cómo se pueden utilizar.
Url::fromUri()
Este método se utiliza para crear un objeto URL a partir de una cadena "URI", como una URL externa o una URL interna personalizada.
Ejemplo de uso:
// External URL
$url = Url::fromUri('https://www.google.com');
// Internal URL with query parameters
$url = Url::fromUri('internal:/node/60', ['query' => ['key' => 'value']]);
// Custom scheme
$url = Url::fromUri('base:/my-personal-page');
Url::fromUserInput()
Este método se utiliza para crear una URL en función de la entrada del usuario. Acepta una ruta relativa que los usuarios pueden introducir en el navegador y la resuelve en un objeto URL.
Ejemplo de uso:
$url = Url::fromUserInput('/my-personal-page');
// Adding query parameters
$url = Url::fromUserInput('/my-personal-page', ['query' => ['filter' => 'active']]);
Url::fromInternalUri()
Crea un objeto URL a partir de una URI interna, utilizada específicamente cuando se trabaja dentro de las rutas internas de Drupal.
Ejemplo de uso:
$url = Url::fromInternalUri('node/60');
// Internal URI with options
$url = Url::fromInternalUri('node/60', ['absolute' => TRUE]);
Url::createFromPath()
Este método está obsoleto en las versiones modernas de Drupal, pero se utilizaba para crear un objeto URL basado en una ruta.
Ejemplo de uso:
$url = Url::createFromPath('/custom-path');
Url::fromString()
Este método se utiliza para crear un objeto URL a partir de una ruta o URL basada en una cadena.
Ejemplo de uso:
// Creating from a string path
$url = Url::fromString('/user/login');
// Including query parameters
$url = Url::fromString('/node/999', ['query' => ['destination' => 'home']]);
Url::fromRouteMatch()
Este método crea un objeto URL a partir del objeto RouteMatch actual, lo que resulta útil cuando se trabaja con el sistema de enrutamiento en los controladores.
Ejemplo de uso:
// Get the current route match (usually done within a controller)
$route_match = \Drupal::routeMatch();
// Create a URL object from the route match
$url = Url::fromRouteMatch($route_match);
Parámetros comunes en el array $options
Cuando se crea un objeto URL en Drupal con los métodos fromRoute(), fromUri(), u otros, el array $options te permite pasar parámetros adicionales que modifican el comportamiento de la URL generada. Las opciones comunes que se pueden enviar son:
- absolute: Si TRUE, genera una URL absoluta. Si FALSE(predeterminado), genera una URL relativa.
- query: Una matriz de parámetros de cadena de consulta para agregar a la URL.
- fragment: Agrega un identificador de fragmento a la URL (por ejemplo, #section1)
- language: Un LanguageInterfaceobjeto para generar la URL en un idioma específico.
- https: Fuerza el esquema a HTTPS si se establece en TRUE. Esta opción está obsoleta en Drupal moderno ya que HTTPS debe manejarse a nivel de servidor.
- base_url: Una URL base para usar en lugar de la predeterminada.
- prefix: Agrega un prefijo de ruta (como un prefijo de idioma o una sección del sitio).
- entity_type y entity: Para generar URL basadas en entidades.
Algunos ejemplos
¡Ahora vamos a mostrar algunos ejemplos poniendo en práctica todo lo visto hasta este punto!
En este primer ejemplo vamos a generar una URL para una ruta, agregar parámetros de consulta, hacerla absoluta y agregar un identificador de fragmento.
// Generate a URL to a specific route with options.
$options = [
'absolute' => TRUE, // Make the URL absolute
'query' => ['page' => 1, 'category' => 'food'], // Add query parameters
'fragment' => 'comments', // Add a fragment identifier
];
// Create a URL to the 'entity.node.canonical' route for node 96.
$url = Url::fromRoute('entity.node.canonical', ['node' => 96], $options);
// Convert the Url object to a string.
$url_string = $url->toString();
La URL generada sería la siguiente: http://www.my-web.com/node/96?page=1&category=food#comments
En el siguiente ejemplo vamos a construir una URL con opciones utilizando Url::fromUri().
// Generate an external URL with query parameters and absolute URL option.
$options = [
'absolute' => TRUE, // Generate an absolute URL
'query' => ['ref' => 'newsletter'], // Add query parameters
'fragment' => 'subscribe', // Add fragment identifier
];
$url = Url::fromUri('https://www.personal-web.com/subscribe', $options);
// Convert to a string.
$url_string = $url->toString();
La URL generada sería la siguiente: https://www.personal-web.com/subscribe?ref=newsletter#subscribe
Mostrar URL en una plantilla Twig
Es posible pasar URL's y enlaces a una plantilla Twig. En el siguiente caso de uso, vamos a enviar un enlace desde el controlador y renderizarlo desde una plantilla Twig.
Controlador (mymodule/src/Controller/SampleController.php):
public function myPage() {
$url = Url::fromRoute('entity.node.canonical', ['node' => 1]);
$link = Link::fromTextAndUrl('Go to Node 1', $url);
return [
'#theme' => 'my_template',
'#my_link' => $link->toRenderable(),
];
}
Plantilla Twig (mytheme/templates/mytemplate.html.twig):
<div>
{{ my_link }}
</div>
¿Y tú, cómo haces uso de las URL en Drupal?