次のパターン "-{entity_id}"のエンティティIDが含まれている場合にユーザーが正しいURLにリダイレクトされるように、受信URLを変更してURLをエンティティに解決するモジュールに取り組んでいます。
上記の実際の例:
最終URL:
http://romajazz.it/concerti/pozzovio-de-angelis-4902 エイリアスの使用:
しばらく調査しました。この問題を解決できるhook_url_inbound_alter()
がDrupal 7にあることがわかりました。
Drupal 8.にInboundPathProcessorInterface
があることもわかりました。
InboundPathProcessorInterface
の実装について考え、KernelEvents::REQUEST
でサブスクライブするEventSubscriberInterface
実装で使用しました。
このアプローチは正しいのでしょうか。 Drupal 8)でこれを行う他の方法はありますか?
PathProcessorAlias()
クラスはおそらく最良の例です。
InboundPathProcessorInterface
を実装するクラスを持つモジュールを作成します。path_processor_inbound
_ サービスタグ があることを確認します。これにより、コレクションにマークが付けられ、パスプロセッサに関連付けられます。実行する場所を変更するには、優先順位でプレイする必要がある場合があります。エンティティを検索するには、クラスに注入された依存関係が必要です。 EntityManager()
は最近バラバラになり、本当に必要なものを忘れてしまいました。 PathValidator()
サービスも必要とする場合があります。
以下は、次のような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;
}
}