¿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?


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;
}

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;
}

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


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;
        }

$ 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!


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();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.