En Drupal 7, uso el siguiente código.
function my_goto($path) {
drupal_goto($path, array(), 301);
}
¿Qué código debo usar en Drupal 8?
En Drupal 7, uso el siguiente código.
function my_goto($path) {
drupal_goto($path, array(), 301);
}
¿Qué código debo usar en Drupal 8?
Respuestas:
Este es el código que debe usarse en Drupal 8. Consulte el registro de cambios para obtener más información.
use Symfony\Component\HttpFoundation\RedirectResponse;
function my_goto($path) {
$response = new RedirectResponse($path);
$response->send();
return;
}
use Symfony\Component\HttpFoundation\RedirectResponse;
Para construir sobre la respuesta de Anu Mathew ;
Para agregar un código de estado, es solo el segundo parámetro en la clase RedirectResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
function my_goto($path) {
$response = new RedirectResponse($path, 302);
$response->send();
return;
}
Todavía no trabajé en drupal 8, pero según la documentación drupal_goto
se eliminó de Drupal 8.
En lugar de drupal_goto
que necesite escribir:
return new RedirectResponse(\Drupal::url('route.name'));
y algo así con parámetros:
return new RedirectResponse(\Drupal::url('route.name', [], ['absolute' => TRUE]));
Consulte aquí https://www.drupal.org/node/2023537 y la clase RedirectResponse
\Drupal::url('route.name')
con tu url o quizás con una url absoluta.
Esto se puede lograr aprovechando las sinfonías integradas EventDispatcher Component. Todo lo que tienes que hacer es crear un módulo personalizado. Agregue su archivo services.yml y proporcione la configuración de servicio adecuada.
services:
mymodue.subscriber:
class: Drupal\my_module\EventSubscriber
tags:
- { name: event_subscriber }
en el directorio src de tus módulos, crea tu clase EventSubscriber.php y describe tus métodos aquí.
<?php
use Symfony\Component\HttpFoundation\RedirectResponse;
public function checkForCustomRedirect(GetResponseEvent $event) {
$route_name = \Drupal::request()->attributes->get(RouteObjectInterface::ROUTE_NAME);
if($route_name === 'module.testPage') {
$event->setResponse(new RedirectResponse($url, $status = 302,$headers);
}
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
$events = [];
$events[KernelEvents::REQUEST][] = array('checkForCustomRedirect');
return $events;
}
El código de redireccionamiento que funciona perfectamente para mí es el siguiente:
$response = new RedirectResponse($path);
return $response->send();
En cualquier otro caso, recibo algún tipo de excepciones o errores, por ejemplo: LogicException: el controlador debe devolver una respuesta ...
O
https://www.drupal.org/project/drupal/issues/2852657
Ya hay una discusión al respecto, ¡espero que ayude!
Esto funciona para la redirección interna o externa:
use Symfony\Component\HttpFoundation\RedirectResponse;
use Drupal\Core\Url;
$url = Url::fromUri('internal:/node/27'); // choose a path
// $url = Url::fromUri('https://external_site.com/');
$destination = $url->toString();
$response = new RedirectResponse($destination, 301);
$response->send();