web-dev-qa-db-ja.com

メニュー項目タイプを変更するためのhook_menu_alter()に相当するものは何ですか?

Drupal 8.でメニュータイプを変更したい。Drupal 7では、これは hook_menu_alter を使用して実現できます。

function module_menu_alter(&$items) {
  $items['admin/config/people/ip-blocking/default'] = array(
    'title' => 'Block IP Address',
    'type' => MENU_DEFAULT_LOCAL_TASK,
  );
}

同様に、メニュータイプをDrupal 8.で変更したいと思っています。どうすればよいですか。ありがとうございます。

10
Vamsi

Linusからの回答は素晴らしいですが、特定の質問に対するフィードバックはありません。

同様に、Drupal 8でメニュータイプを変更したい

Drupal 8.にはメニュータイプなどはありません。これまでタイプであったものはすべて、ルート、メニューリンク、ローカルタスク、ローカルアクションなど、完全に異なるものになりました。多くの場合、ルートは常にあり(7.xはこのタイプのコールバックを呼び出すために使用されます)さらに、そのルートのメニューリンク、ローカルタスク、またはアクションを追加します。

したがって、たとえばメニューリンクをローカルタスクに変換したり、ルートをローカルタスクに変換したりすることはできません。あなたができる唯一のことは、例えばです。メニューリンクを変更し(上記のルート変更とは関係ありません)、代わりに新しいローカルタスクを作成します。

Linusの回答を参照して、リンクとそれらの各操作を行う方法の詳細を確認してください。

7
Berdir

Drupal 8には新しいメニューシステムがあり、hook_menuhook_menu_alterはなくなりました。

既存のルートを変更したい場合は、Drupal 7.と比較すると少し複雑です。

モジュールで、RouteSubscriberBaseを拡張するクラスファイルをYOURMODULE/src/Routing/CLASSNAME.phpに作成する必要があります。

/**
 * @file
 * Contains \Drupal\YOURMODULE\Routing\RouteSubscriber.
 */

namespace Drupal\YOURMODULE\Routing;

use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;

/**
 * Listens to the dynamic route events.
 */
class RouteSubscriber extends RouteSubscriberBase {

  /**
   * {@inheritdoc}
   */
  protected function alterRoutes(RouteCollection $collection) {
    // Get the route you want to alter
    $route = $collection->get('system.admin_content');

    // alter the route...
  }
}

例として、ノードモジュールの RouteSubsciber クラスを使用できます。

RouteSubscriberを認識させるには、モジュールディレクトリのルートにYOURMODULE.services.ymlファイルも作成する必要があります。

services:
  node.route_subscriber:
    class: Drupal\YOURMODULE\Routing\RouteSubscriber
    tags:
      - { name: event_subscriber }

新しいメニューシステムをよりよく理解するには、次の記事をお勧めします。

編集:Berdirによる言及 と同様に、メニューシステムは異なる構造になり、D7のメニューシステムとは何の関係もありません。 、メニュータイプなどはもうありません。

19
Linus