web-dev-qa-db-ja.com

hook_url_inbound_alter()に相当するものをどのように実装しますか?

次のパターン "-{entity_id}"のエンティティIDが含まれている場合にユーザーが正しいURLにリダイレクトされるように、受信URLを変更してURLをエンティティに解決するモジュールに取り組んでいます。

上記の実際の例:

最終URL:

しばらく調査しました。この問題を解決できるhook_url_inbound_alter()がDrupal 7にあることがわかりました。

Drupal 8.にInboundPathProcessorInterfaceがあることもわかりました。

InboundPathProcessorInterfaceの実装について考え、KernelEvents::REQUESTでサブスクライブするEventSubscriberInterface実装で使用しました。

このアプローチは正しいのでしょうか。 Drupal 8)でこれを行う他の方法はありますか?

3
otarza

PathProcessorAlias()クラスはおそらく最良の例です。

  • InboundPathProcessorInterfaceを実装するクラスを持つモジュールを作成します。
  • モジュールに サービス定義 を作成します。
  • サービスに_path_processor_inbound_ サービスタグ があることを確認します。これにより、コレクションにマークが付けられ、パスプロセッサに関連付けられます。実行する場所を変更するには、優先順位でプレイする必要がある場合があります。

エンティティを検索するには、クラスに注入された依存関係が必要です。 EntityManager()は最近バラバラになり、本当に必要なものを忘れてしまいました。 PathValidator()サービスも必要とする場合があります。

13
mpdonadio

以下は、次のようなURLにアクセスしたときに記述される必要のあるコードの具体例です。

www.my-website.com/my-pretty-alias

次のページのコンテンツを実際に表示します。

www.my-website.com/my-technical-needed-path/such-as/node/8

my-pretty-aliasはURLバーに表示されます

My_module.services.ymlファイルで:

services:
  my_module.my_service_identifier:
    class: Drupal\my_module\Service\MyServiceName
    tags:
      - { name: path_processor_inbound }

My_module/src/Service/MyServiceName.phpファイル:

<?php

namespace Drupal\my_module\Service;

use Drupal\Core\PathProcessor\InboundPathProcessorInterface;
use Symfony\Component\HttpFoundation\Request;

class MyServiceName implements InboundPathProcessorInterface {

  public function processInbound($path, Request $request) {

    if (strpos($path, '/my-pretty-alias') === 0) {
      $path = preg_replace('#^/my-pretty-alias#', '/my-technical-needed-path/such-as/node/8', $path);

    }
    return $path;
  }

}
1