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;
}
}
Seitdem ich diese Frage gestellt habe, hat sich der Drupal 8-Kern geändert und einige Probleme mit Routen wurden behoben.
hook_menu()
wird ab Drupal 8 nicht mehr verwendet; Die von einem Modul verwendeten Routen werden in einer .routing.yml-Datei definiert (z . B. user.routing.yml ). Alter Hooks werden immer noch verwendet, aber da erhook_menu()
nicht mehr vom Drupal-Kern verwendet wird,hook_menu_alter()
wird er auch nicht verwendet.Folgende Schritte sind erforderlich, um eine in anderen Modulen definierte Route zu ändern:
Definieren Sie einen Service
Erstellen Sie eine Klasse, die die
RouteSubscriberBase
Klasse erweitert.Beachten Sie, dass im Vergleich zu früheren Drupal 8-Versionen einige Details geändert wurden.
user_page
nach geändertuser.page
_access: 'TRUE'
nach geändert_user_is_logged_in: 'TRUE'
_content
nach geändert_controller
quelle
$collection->get()
durchzugehen. Ich kann keine offensichtlichen Methoden sehen.ArrayIterator
Objekt mitRouteCollection::getIterator()
; Das würde es einfacher machen, alle Elemente in zu durchlaufen$collection
. Sie können auch alle Routen$collection
mitRouteCollection::all()
einlesen, wodurch ein Array zurückgegeben wird.