Nói cách khác, Drupl 8 tương đương với hook_menu_alter () là gì?
Drupal 8 vẫn sử dụng hook_menu () , nhưng với những gì tôi có thể thấy, thông tin được trả về bởi hook khác với những gì hook trả về trong Drupal 7. Ví dụ, định nghĩa được đưa ra trong user_menu () cho người dùng là như sau.
$items['user'] = array(
'title' => 'User account',
'title callback' => 'user_menu_title',
'weight' => -10,
'route_name' => 'user_page',
'menu_name' => 'account',
);
Thuộc tính route_name liên kết đến một mục trong tệp user.routing.yml .
user_page:
pattern: '/user'
defaults:
_content: '\Drupal\user\Controller\UserController::userPage'
requirements:
_access: 'TRUE'
Điều này khác với những gì được thực hiện với Symphony và nó làm tôi bối rối về cách một mô-đun có thể thay đổi tuyến đường được xác định từ người dùng khác.
Hàm duy nhất vẫn đang gọi hook_menu_alter()
là menu_router_build () , nhưng hàm đó vẫn chứa mã cần được cập nhật, vì nó vẫn đang sử dụng hiện không dùng nữa 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;
}
}