Components
Adding a menu link to some existing menu programmatically (for example in an update hook) is something I have to do fairly often. Here's how you can add a new menu link to the main menu:
use Drupal\menu_link_content\Entity\MenuLinkContent;
function MY_MODULE_update_8001() {
MenuLinkContent::create([
'title' => 'About',
'link' => ['uri' => 'internal:/about'],
'menu_name' => 'main',
'weight' => -50,
])->save();
}
And if you want to add a submenu link you first have to load the parent link and then create a submenu link:
use Drupal\menu_link_content\Entity\MenuLinkContent;
function MY_MODULE_update_8001() {
$menu_link_parents = \Drupal::entityTypeManager()
->getStorage('menu_link_content')
->loadByProperties([
'title' => 'Dashboard',
'menu_name' => 'main',
]);
$menu_link_parent = reset($menu_link_parents);
if ($menu_link_parent) {
MenuLinkContent::create([
'title' => 'Add tasks',
'link' => ['uri' => 'internal:/add-task'],
'menu_name' => 'main',
'weight' => -50,
'parent' => $menu_link_parent->getPluginId(),
])->save();
}
}