web-dev-qa-db-ja.com

多言語サイトの分類用語パラメータをどのように扱いますか?

私はtidパラメータを受け取るカスタムコントローラを持っています:

/myroute/{tid}

Tidは分類法用語でアップキャストされているので、私のコントローラーメソッドでは次のようになっています。

public function index(TaxonomyTerm $tid)

この関数では、分類エンティティを取得できます。

しかし、私のコントローラーを呼び出すために、それはSEOフレンドリーではありません...私は例えば/ myroute/43を持っています。

だから、私はあなたが特別なcaractereを持つことができ、それが多言語サイトで良い実践ではないので、私は用語名を渡しません。

したがって、私にとって最良の方法は、pathautoを使用して、分類用語のパスを生成して、次のようにすることです。

/ [term_category] ​​/ [term_name]

今私の質問はこれを私のコントローラーにどのように渡すかです。

私はそのような私のコントローラーを呼び出す必要があります:

<a href="myroute/{param_taxo}">

だから私はどのようにSEOのフレンドリーなURLで用語のtidを取得するのかわかりません。

それについて何か経験はありますか?

2
Kevin

ルートを/myroute/{alias}のように編集する必要があります。

次に、次のように用語をコントローラーにロードできます。

public function index($alias) {
  // Find the term by path alias.
  $path = \Drupal::service('path_alias.manager')->getPathByAlias($alias);
  if (preg_match('/taxonomy\/term\/(\d+)/', $path, $matches)) {
    $term = $this->entityTypeManager->getStorage('taxonomy_term')->load($matches[1]);
  }
  if (isset($term) && $term instanceof TermInterface) {
    $term_id = $term->id();
  }
}

NB:path_alias.managerサービスがDrupal 8.8.xに追加されました。古いバージョンを使用している場合は、代わりにpath.alias_managerサービスを使用する必要があります。

3
user72672