メニューにリンクを追加する
モジュールの設定ページのプレースホルダーを作成したので、メニューのリンクを追加しましょう。以下の手順では、「管理者>設定」ページ(http://example.com/admin/config)の「開発」セクションにhello_worldモジュールへのメニューリンクを作成する方法を示します。
モジュールのルートフォルダーにhello_world.links.menu.ymlという名前の新しいファイルを作成し、次の内容を追加します:
hello_world.admin:
title: 'Hello module settings'
description: 'example of how to make an admin settings page link'
parent: system.admin_config_development
route_name: hello_world.content
weight: 100
最初の行が名前空間を予約していることに注意してください(ルーティングファイルの例と同様)。また、5行目でルート名を使用していることにも注意してください(ルーティングファイルの例の最初の行の名前空間を使用しています)。タイトルと説明は「開発」セクションに表示されます。parent行がメニューの親リンクを説明していることに注意してください。つまり、メニューリンクはadmin、config、developmentの下に作成されます。
これにより、サイトの管理ページの「設定」タブ(URL/admin/config)の「開発」セクションに、hello_world.content(この例ではhello_world.routing.yml)で指定されたパスへのリンクが追加されます。もちろん、変更を有効にするにはキャッシュをクリアする必要があります。
キャッシュをクリアすると、設定ページの「開発」セクションに「Helloモジュール設定」メニューリンクがあります。リンクをクリックすると、hello_worldモジュールが呼び出されます。
追加のヒント
.links.menu.ymlファイルはかなり柔軟です。外部リソースへのリンクにも使用できます:
hello_world.admin:
title: 'Hello module settings'
description: 'example of how to make an admin settings page link'
parent: system.admin_config_development
url: http://example.com/this-is-some-example
weight: 100
hello_world.admin2:
title: 'Hello module settings'
description: 'example of how to make an admin settings page link'
parent: system.admin_config_development
url: internal:/some-internal-path
編集不可:
このようにymlファイルとカスタムモジュールを使用してメニューリンクを作成すると、UIで編集できないメニューリンクになることに注意してください。リンクはymlファイルでのみ変更できます。これらはモジュールによって管理されていると見なされ、管理者によって管理されているとは見なされません。メニュー項目の編集ボタンをクリックすると、「このリンクはモジュールXXXによって提供されています。タイトルとパスは編集できません」というメッセージが表示されます。

編集可能なメニューリンクを作成するには、次のようにする必要があります:
$my_menu = \Drupal::entityTypeManager()->getStorage('menu_link_content')
->loadByProperties(['menu_name' => 'my-menu-name']);
foreach ($my_menu as $menu_item) {
$parent_id = $menu_item->getParentId();
if (!empty($parent_id)) {
$top_level = $parent_id;
break;
}
}
$menu_link = MenuLinkContent::create([
'title' => 'My menu link title',
'link' => ['uri' => 'internal:/my/path'],
'menu_name' => 'my-menu-name',
'parent' => $top_level,
'expanded' => TRUE,
'weight' => 0,
]);
$menu_link->save();