theme_menu_link() has been removed. Menu links must now be processed as a collection using hook_preprocess_HOOK() for menu.html.twig and derivative templates.
Use hook_preprocess_menu() to target all menus, or hook_preprocess_menu__MENU_NAME() to target a specific menu. Refer to MenuLinkTree::build() and MenuLinkTree::buildItems() for details.
Before:
function MYTHEME_menu_link(&$variables) {
// Force menu link text to be lower-case.
$element = &$variables['element'];
$element['#title'] = drupal_strtolower($element['#title']);
return theme_menu_link($variables);
}
Now:
function MYTHEME_preprocess_menu(&$variables) {
// Force menu link text to be lower-case.
// @see MenuLinkTree::build() and MenuLinkTree::buildItems() for details
// of how $variables['items'] is structured.
$process_items = function(&$items) use (&$process_items) {
foreach ($items as &$item) {
$item['title'] = mb_strtolower($item['title']);
if (!empty($item['below'])) {
$process_items($item['below']);
}
}
};
$process_items($variables['items']);
}
Notes:
Although menu_link_content is now an Entity Type in Drupal 8, none of the hooks for altering how an entity is rendered (refer to core/lib/Drupal/Core/Entity/entity.api.php) are invoked when menus are rendered, so these cannot be used as a substitute for theme_menu_link().
The menu links themselves are generated via the generic Twig link() function (see Drupal\Core\Template\TwigExtension::getLink()) and are indistinguishable from non-menu links generated that same way, and so hook_link_alter() is also not appropriate.