Mit anderen Worten, was ist das Drupl 8-Äquivalent von hook_menu_alter () ?
Drupal 8 verwendet immer noch hook_menu () , aber soweit ich sehen kann, unterscheiden sich die vom Hook zurückgegebenen Informationen von denen, die der Hook in Drupal 7 zurückgegeben hat. Die Definition in user_menu () für user lautet beispielsweise wie folgt.
$items['user'] = array(
'title' => 'User account',
'title callback' => 'user_menu_title',
'weight' => -10,
'route_name' => 'user_page',
'menu_name' => 'account',
);
Die Eigenschaft route_name verweist auf einen Eintrag in der Datei user.routing.yml .
user_page:
pattern: '/user'
defaults:
_content: '\Drupal\user\Controller\UserController::userPage'
requirements:
_access: 'TRUE'
Dies unterscheidet sich von der Vorgehensweise in Symphony, und es verwirrt mich, wie ein Modul die von einem anderen Benutzer definierte Route ändern kann.
Die einzige Funktion, die immer noch aufgerufen wird, hook_menu_alter()
ist menu_router_build () , aber diese Funktion enthält immer noch Code, der aktualisiert werden muss, da sie immer noch den jetzt veralteten Code verwendet drupal_alter()
.
// Alter the menu as defined in modules, keys are like user/%user.
drupal_alter('menu', $callbacks);
foreach ($callbacks as $path => $router_item) {
// If the menu item is a default local task and incorrectly references a
// route, remove it.
// @todo This may be removed later depending on the outcome of
// http://drupal.org/node/1889790
if (isset($router_item['type']) && $router_item['type'] == MENU_DEFAULT_LOCAL_TASK) {
unset($callbacks[$path]['route_name']);
}
// If the menu item references a route, normalize the route information
// into the old structure. Note that routes are keyed by name, not path,
// so the path of the route takes precedence.
if (isset($router_item['route_name'])) {
$router_item['page callback'] = 'USES_ROUTE';
$router_item['access callback'] = TRUE;
$new_path = _menu_router_translate_route($router_item['route_name']);
unset($callbacks[$path]);
$callbacks[$new_path] = $router_item;
}
}