web-dev-qa-db-ja.com

EventSubscriberクラスをサブクラス化するクラスにリダイレクトするにはどうすればよいですか?

ページが見つかりませんページを表示する代わりに、EventSubscriberクラスの特定のURLにリダイレクトしたいです。私は イベントリスナーのsymfony2リダイレクト? に従いましたが、リダイレクトはホームに行きます。

これは私が使用しているコードです。

use Drupal\Core\Url;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class PageNotFound implements EventSubscriberInterface {
  public function pageNotFound(GetResponseEvent $event) {
    $request = $event->getRequest();
    $id = '1234';
    $scheme_and_http_Host = $request->getSchemeAndHttpHost();
    $url = Url::fromRoute('myroute', ['id' => $id])->toString(); // this url exist (checked)

    $response = new RedirectResponse($scheme_and_http_Host . $url, Response::HTTP_MOVED_PERMANENTLY);
    $event->setResponse($response);
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    $events[KernelEvents::REQUEST][] = ['pageNotFound'];
    return $events;
  }
}

mymodule.services.yml

services:
  mymodule.page_not_found:
    class: Drupal\mymodule\EventListener\PageNotFound
    tags:
      - {name: event_subscriber}

EventSubscriberクラスからユーザーをリダイレクトするにはどうすればよいですか?

2
rpayanm

404例外をキャッチするには、_KernelEvents::EXCEPTION_イベントをサブスクライブする必要があります。すでにHTML例外の基本クラスがあるので、これを自分でコーディングする必要はありません。 HttpExceptionSubscriberBase を拡張するクラスのon404()メソッドにコードを配置するだけです。

例外サブスクライバーのユーティリティ基本クラス。

サブスクライバーは、このクラスを拡張し、getHandledFormats()を実装して、応答する要求フォーマットを示すことができます。次に、処理する必要があるエラーコード(HTTP応答コード)のon *()メソッドを実装します。たとえば、404 Not Foundメッセージを処理するには、メソッドを追加します。

public function on404(GetResponseForExceptionEvent $event) {}

そのメソッドは$ event-> setResponse()を呼び出して、例外の応答オブジェクトを設定する必要があります。あるいは、そうしないことを選択することもできます。そうすると、他のリスナーが例外を処理する機会を得ます。

3
4k4