Que função / método posso usar para redirecionar usuários para uma página diferente?

11

No Drupal 7, eu uso o seguinte código.

function my_goto($path) { 
  drupal_goto($path, array(), 301);
}

Qual código devo usar no Drupal 8?

Anu Mathew
fonte
3
drupal.org/node/2023537 é o registro de alterações para drupal_goto (), sempre que você estiver procurando por uma substituição para uma função específica, procure primeiro.
Berdir

Respostas:

24

Este é o código que deve ser usado no Drupal 8. Consulte change Record para obter mais informações.

use Symfony\Component\HttpFoundation\RedirectResponse;

function my_goto($path) { 
  $response = new RedirectResponse($path);
  $response->send();
  return;
}
Anu Mathew
fonte
6
Não se esqueça de adicionaruse Symfony\Component\HttpFoundation\RedirectResponse;
Matt Fletcher
Este é um código HttpFoundation de baixo nível, não adequado para um aplicativo Symfony, consulte symfony.com/doc/current/components/… .
user89751
8

Construir sobre a resposta de Anu Mathew ;

Para adicionar um código de status, é apenas o segundo parâmetro na classe RedirectResponse;

use Symfony\Component\HttpFoundation\RedirectResponse;

function my_goto($path) { 
  $response = new RedirectResponse($path, 302);
  $response->send();
  return;
}
cristão
fonte
11
Para mim, isso parece funcionar apenas uma vez e precisa ser limpo em cache sempre que você quiser que funcione novamente. Existe uma maneira de contornar isso?
Matt
@Matt See drupal.stackexchange.com/a/222700/14151
Matt Fletcher
4

Ainda não trabalhei no drupal 8, mas conforme a documentação drupal_gotoé removida do drupal 8.

No lugar de drupal_gotovocê precisa escrever:

return new RedirectResponse(\Drupal::url('route.name'));

e algo assim com parâmetros:

return new RedirectResponse(\Drupal::url('route.name', [], ['absolute' => TRUE]));

Verifique aqui https://www.drupal.org/node/2023537 e classe RedirectResponse

Sumit Madan
fonte
Obrigado pela sua reply.But como posso obter o nome da rota a partir do URL atual (Porque url é a criação, utilizando o formulário de configuração)
Anu Mathew
Você quer dizer que o caminho de redirecionamento é dinâmico ???
Sumit Madan
Sim, você está certo, é dinâmico ..
Anu Mathew
Ok, tente substituir \Drupal::url('route.name')por seu URL ou talvez absoluto.
Sumit Madan
retornar novo RedirectResponse ($ absolute_url); funcionou para mim :) Mas está mostrando a mensagem "redirecionar para example.com/absolute_url " na tela
Anu Mathew
4

Isso pode ser conseguido aproveitando o componente EventDispatcher de sinfonias integradas. Tudo que você precisa fazer é criar um módulo personalizado. Inclua seu arquivo services.yml e forneça a configuração de serviço apropriada.

services:
  mymodue.subscriber:
    class: Drupal\my_module\EventSubscriber
    tags:
      - { name: event_subscriber }

no diretório src dos seus módulos, adicione sua classe EventSubscriber.php e descreva seus métodos aqui.

    <?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
fonte
$ url não está definido.
Dan Shumaker
1

O código de redirecionamento que funciona perfeitamente para mim é o seguinte:

$response = new RedirectResponse($path);
return $response->send();

Em outros casos, estou recebendo algum tipo de exceção ou erro, por exemplo: LogicException: o controlador deve retornar uma resposta ...

OU

https://www.drupal.org/project/drupal/issues/2852657

Já existe uma discussão sobre isso, espero que ajude!

Junkuncz
fonte
0

isso funciona para redirecionamento interno ou externo:

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
fonte