¿Qué función / método puedo usar para redirigir a los usuarios a una página diferente?

11

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?

Anu Mathew
fuente
3
drupal.org/node/2023537 es el registro de cambios para drupal_goto (), siempre que esté buscando un reemplazo para una función específica, busque allí primero.
Berdir

Respuestas:

24

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;
}
Anu Mathew
fuente
66
No te olvides de agregaruse Symfony\Component\HttpFoundation\RedirectResponse;
Matt Fletcher
Este es un código HttpFoundation de bajo nivel que no es adecuado en una aplicación Symfony, consulte symfony.com/doc/current/components/… .
user89751
8

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;
}
cristiano
fuente
1
Para mí, esto solo parece funcionar una vez, y tiene que tener que borrar el caché cada vez que desea que vuelva a funcionar. ¿Hay alguna manera de evitar eso?
Matt
@
Matt
4

Todavía no trabajé en drupal 8, pero según la documentación drupal_gotose eliminó de Drupal 8.

En lugar de drupal_gotoque 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

Sumit Madan
fuente
Gracias por su reply.But ¿Cómo puedo obtener el nombre de la ruta de la URL actual (Debido url es establecer utilizando el formulario de configuración)
Anu Mathew
¿Quieres decir que la ruta de redireccionamiento es dinámica?
Sumit Madan
Sí, tu derecho es dinámico ..
Anu Mathew
Ok, intenta reemplazarlo \Drupal::url('route.name')con tu url o quizás con una url absoluta.
Sumit Madan
return new RedirectResponse ($ absolute_url); funciona para mí :) Pero muestra el mensaje "redirigir a example.com/absolute_url " en la pantalla
Anu Mathew
4

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;
        }
Jay Chand
fuente
$ url no está definido.
Dan Shumaker
1

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!

Junkuncz
fuente
0

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();
Matoeil
fuente