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?
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?
Respostas:
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;
}
use Symfony\Component\HttpFoundation\RedirectResponse;
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;
}
Ainda não trabalhei no drupal 8, mas conforme a documentação drupal_goto
é removida do drupal 8.
No lugar de drupal_goto
você 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
\Drupal::url('route.name')
por seu URL ou talvez absoluto.
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;
}
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!
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();