我可以使用什么功能/方法将用户重定向到另一个页面?


Answers:


24

这是在Drupal 8中应该使用的代码。有关更多信息,请参见change Record

use Symfony\Component\HttpFoundation\RedirectResponse;

function my_goto($path) { 
  $response = new RedirectResponse($path);
  $response->send();
  return;
}

6
别忘了添加use Symfony\Component\HttpFoundation\RedirectResponse;
Matt Fletcher '18

这是不适合Symfony应用程序的低级HttpFoundation代码,请参见symfony.com/doc/current/components/…
user89751 '19

8

阿努马修(Anu Mathew)的反应为基础 ;

要添加状态码,它只是RedirectResponse类中的第二个参数;

use Symfony\Component\HttpFoundation\RedirectResponse;

function my_goto($path) { 
  $response = new RedirectResponse($path, 302);
  $response->send();
  return;
}

1
对我来说,这似乎只能工作一次,并且每次您希望它再次工作时都必须清除缓存。有办法解决吗?
马特


4

我还没有在Drupal 8中工作,但是根据文档,drupal_goto它已从Drupal 8中删除。

代替drupal_goto您需要写:

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

和类似这样的参数:

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

在此处检查https://www.drupal.org/node/2023537分类RedirectResponse


感谢您的答复。但是我如何从当前网址获取路由名称(因为网址是使用配置表格进行设置的)
Anu Mathew 2014年

您的意思是重定向路径是动态的???
Sumit Madan 2014年

是的,你的右手其动态..
阿努马修

确定尝试\Drupal::url('route.name')用您的网址或绝对网址替换。
Sumit Madan

返回新的RedirectResponse($ absolute_url); 为我工作:)但是它在屏幕上显示“ redirect to example.com/absolute_url ”消息
Anu Mathew 2014年

4

这可以通过利用内置交响曲EventDispatcher Component来实现。您要做的就是创建一个自定义模块。添加您的services.yml文件并提供适当的服务配置。

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

在您的模块src目录中,添加创建您的EventSubscriber.php类并在此处描述您的方法。

    <?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未定义。
Dan Shumaker

1

对我来说,完美的重定向代码如下:

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

在任何其他情况下,我都会遇到某种异常或错误,例如: LogicException:控制器必须返回响应...

要么

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

已经有关于它的讨论,希望能有所帮助!


0

这适用于内部或外部重定向:

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();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.