Umi Blog
ウミブログ

Drupalではメニューのアイテムのことをメニューリンクといいます。メニューリンクの作り方には以下の3種類があります。
今回はこれらの方法や特性について詳しく解説したいと思います。
管理画面からメニューを作ると、バックエンドではMenuLinkContentというエンティティが作成され、DBのmenu_linkで始まるテーブルに保存されます。MenuLinkContentエンティティには以下のような特性があります。
実際のプロジェクトではサイトのナビゲーションなどは管理画面から作ることが多いのではないかと思います。管理画面からのメニューリンクの作り方は以下のようになります。
/admin/structure/menu)に移動メニューの編集をクリック/admin/structure/menu/manage/[MENU_NAME])にてリンクの追加をクリックメニューリンクのタイトルとリンク先を入力して保存メニューリンクを作成すると以下のように表示されます。
続いて、links.menu.ymlで作る方法を紹介します。この方法はコアやコントリビュートモジュールでメニューリンクを作るときの標準的な方法として使われています。
この方法で作られるメニューリンクには以下のような特性があります。
menu_treeに保存される管理画面から編集できないという特性から、カスタムモジュールを使う際に無くてはならないメニューリンクを作成するのに向いている方法です。
作り方は以下のようになります。まずカスタムモジュールを作成し、モジュールディレクトリ直下に[MY MODULE}.links.menu.ymlというファイルを作成します。
mymodule
└mymodule.info.yml
└mymodule.links.menu.yml
今回はさきほど管理画面で編集したmy_menuというメニューにE、Fというメニューリンクを追加してみます。FはEの子アイテムとします。
links.menu.ymlの中身を以下のように編集します。
mymodule.e:
title: 'E'
description: 'Menu Item E'
menu_name: my-menu
url: internal:/test
mymodule.f:
title: 'F'
description: 'Menu Item F'
menu_name: my-menu
parent: mymodule.e
url: internal:/test
モジュールを有効化するとこのようにメニューが生成されます。
それぞれ編集画面にアクセスはできますが、タイトルとパスは編集できません。
YAMLを書く際の主な注意点は以下になります。
mymodule.e)のmymoduleの部分はモジュールのマシン名titleは必須urlをroute_nameにするとルートでも指定可。urlとroute_nameのどちらかが必須menu_nameが無い場合はtoolsが使われるそのほかのキーの詳しい情報はこちらをご覧ください。
function hook_menu_links_discovered_alter
管理画面のメニューもlinks.menu.ymlで簡単に子アイテムを増やすことができます。例えば環境設定(/admin/config)に項目を追加する場合は以下のように書きます。
mymodule.settings:
title: 'My Module'
parent: system.admin_config # 環境設定の子アイテムにする
url: internal:/test
mymodule.:
title: 'My Module Settings'
description: 'Configure My Module'
parent: mymodule.settings
url: internal:/test
結果はこのようになります。
ちなみに環境設定のマシン名はcore/modules/system/system.links.menu.ymlで確認することができます。
最後に、カスタムコードでMenuLinkContentエンティティを生成する方法を紹介します。この方法で作られるメニューリンクの特性は以下のようになります。
MenuLinkContentエンティティをカスタムモジュールで実装する場合は以下のようなコードになります。今回は先程追加したFの子アイテムとしてGというメニューリンクを追加してみます。
<?php
use Drupal\menu_link_content\Entity\MenuLinkContent;
/**
* Implements hook_install().
*/
function my_module_install() {
$menu_link = MenuLinkContent::create([
'title' => t('G'),
'link' => ['uri' => 'internal:/test'],
'menu_name' => 'my_menu',
'parent' => 'mymodule.f',
'expanded' => TRUE,
'weight' => 200,
]);
$menu_link->save();
}
結果のスクショです。
今回はhook_installを使いましたが、hookの種類は何でも大丈夫です。create()内のパラメーターを変数にすればメニューリンクを動的に生成することができます。
というわけで、メニューリンクの作り方の紹介でした。それぞれできること・できないことがあるので、場面に合わせて使い分けていきましょう!
小さなご意見も、私たちにとっては大きなヒントです!
ぜひ率直なご感想をお寄せください
この

Masters of Drupal Engineering.
人に、