ユーザーを別のページにリダイレクトするために使用できる関数/メソッドは何ですか?


11

Drupal 7では、次のコードを使用します。

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

Drupal 8ではどのコードを使用する必要がありますか?


3
drupal.org/node/2023537はdrupal_goto()の変更レコードです。特定の関数の代替を探すときは、まずそこを見てください。
Berdir

回答:


24

これは、Drupal 8で使用する必要があるコードです。詳細については、変更レコードを参照してください。

use Symfony\Component\HttpFoundation\RedirectResponse;

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

6
追加することを忘れないでくださいuse Symfony\Component\HttpFoundation\RedirectResponse;
マットフレッチャー

これはsymfonyのアプリケーションに適していないHttpFoundationコード低レベルで、参照symfony.com/doc/current/components/...を
user89751

8

上のビルドにアヌマシューの応答

ステータスコードを追加するには、RedirectResponseクラスの2番目のパラメータのみです。

use Symfony\Component\HttpFoundation\RedirectResponse;

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

1
私にとってこれは1度だけ機能するように思われ、再度機能させるたびにキャッシュをクリアする必要があります。それを回避する方法はありますか?
マット

@Matt drupal.stackexchange.com/a/222700/14151を参照してください
マットフレッチャー

4

私はまだdrupal 8では動作しませんでしたが、ドキュメントに従ってdrupal_gotoDrupal 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を確認してください


お返事ありがとうございます。しかし、現在のURLからルート名を取得するにはどうすればよいですか(URLは構成フォームを使用して設定しているため)
Anu Mathew

リダイレクトパスは動的ですか?
Sumit Madan 2014

はい、あなたの右にそのダイナミックな...
アヌマシュー

OK \Drupal::url('route.name')、あなたのURLまたはおそらく絶対URLで置き換えてみてください。
Sumit Madan 14

新しいRedirectResponse($ absolute_url); は私のために働いています:)しかし、画面に「redirect to example.com/absolute_url」メッセージが表示される
Anu Mathew

4

これは、組み込みの交響曲EventDispatcherコンポーネントを利用することで実現できます。カスタムモジュールを作成するだけです。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();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.