diff --git a/canvas_menu_manager.module b/canvas_menu_manager.module
index e628c92..554f62a 100644
--- a/canvas_menu_manager.module
+++ b/canvas_menu_manager.module
@@ -2,6 +2,8 @@
 
 declare(strict_types=1);
 
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\canvas_menu_manager\Hook\CanvasMenuManagerHooks;
 use Drupal\Core\Entity\ContentEntityFormInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Form\FormStateInterface;
@@ -9,128 +11,10 @@ use Drupal\Core\Form\FormStateInterface;
 /**
  * Implements hook_form_alter().
  */
-function canvas_menu_manager_form_alter(array &$form, FormStateInterface $form_state, string $form_id): void {
-  if (!\Drupal::currentUser()->hasPermission('manage canvas menu items')) {
-    return;
-  }
-
-  $route_name = \Drupal::routeMatch()->getRouteName();
-  if ($route_name !== 'canvas.api.form.content_entity') {
-    return;
-  }
-
-  $form_object = $form_state->getFormObject();
-  if (!$form_object instanceof ContentEntityFormInterface) {
-    return;
-  }
-
-  $entity = $form_object->getEntity();
-  if (!$entity instanceof EntityInterface) {
-    return;
-  }
-
-  $menu_storage = \Drupal::entityTypeManager()->getStorage('menu');
-  $allowed_menus = \Drupal::config('canvas_menu_manager.settings')->get('allowed_menus');
-  $allowed_menus = is_array($allowed_menus) ? array_filter($allowed_menus) : [];
-  $menus = [];
-  foreach ($menu_storage->loadMultiple() as $menu) {
-    if ($allowed_menus !== [] && !in_array($menu->id(), $allowed_menus, TRUE)) {
-      continue;
-    }
-    $menus[$menu->id()] = $menu->label();
-  }
-  if ($menus === []) {
-    return;
-  }
-  /** @var \Drupal\canvas_menu_manager\Service\MenuLinkSyncService $sync */
-  $sync = \Drupal::service('canvas_menu_manager.menu_link_sync');
-  $initial_values = $sync->getEntityMenuLinkValues($entity);
-  if (empty($initial_values['menu_name']) || !isset($menus[$initial_values['menu_name']])) {
-    $initial_values['menu_name'] = isset($menus['main']) ? 'main' : array_key_first($menus);
-  }
-
-  $form['canvas_menu_manager'] = [
-    '#type' => 'details',
-    '#title' => t('Menu'),
-    '#weight' => 95,
-    '#open' => TRUE,
-    '#tree' => TRUE,
-    '#attributes' => [
-      'class' => ['canvas-menu-manager-panel'],
-    ],
-  ];
-
-  $form['canvas_menu_manager']['enabled'] = [
-    '#type' => 'hidden',
-    '#default_value' => (int) ($initial_values['enabled'] ?? 0),
-  ];
-
-  $form['canvas_menu_manager']['menu_name'] = [
-    '#type' => 'hidden',
-    '#default_value' => (string) ($initial_values['menu_name'] ?? (isset($menus['main']) ? 'main' : array_key_first($menus))),
-  ];
-
-  $form['canvas_menu_manager']['title'] = [
-    '#type' => 'hidden',
-    '#default_value' => (string) ($initial_values['title'] ?? $entity->label()),
-  ];
-
-  $form['canvas_menu_manager']['parent'] = [
-    '#type' => 'hidden',
-    '#default_value' => (string) ($initial_values['parent'] ?? ''),
-    '#attributes' => [
-      'data-cmm-field' => 'parent',
-      'data-track-hidden-value' => 'true',
-    ],
-  ];
-
-  $form['canvas_menu_manager']['weight'] = [
-    '#type' => 'hidden',
-    '#default_value' => (int) ($initial_values['weight'] ?? 0),
-    '#attributes' => [
-      'data-cmm-field' => 'weight',
-      'data-track-hidden-value' => 'true',
-    ],
-  ];
-
-  $form['canvas_menu_manager']['tree_json'] = [
-    '#type' => 'hidden',
-    '#default_value' => '[]',
-    '#attributes' => [
-      'data-cmm-field' => 'tree-json',
-      'data-track-hidden-value' => 'true',
-    ],
-  ];
-
-  $form['canvas_menu_manager']['touch'] = [
-    '#type' => 'hidden',
-    '#default_value' => '',
-    '#attributes' => [
-      'data-cmm-field' => 'touch',
-      'data-track-hidden-value' => 'true',
-    ],
-  ];
-
-  $form['canvas_menu_manager']['mount'] = [
-    '#type' => 'container',
-    '#attributes' => [
-      'id' => 'canvas-menu-manager-app',
-      'data-entity-type' => $entity->getEntityTypeId(),
-      'data-entity-id' => (string) $entity->id(),
-    ],
-  ];
-
-  $form['#attached']['library'][] = 'canvas_menu_manager/editor';
-  $form['#attached']['drupalSettings']['canvasMenuManager'] = [
-    'treeEndpoint' => '/canvas-menu/tree',
-    'linkSyncEndpoint' => '/canvas-menu/link-sync',
-    'menus' => $menus,
-    'entityType' => $entity->getEntityTypeId(),
-    'entityId' => (string) $entity->id(),
-    'initialValues' => $initial_values,
-  ];
-
-  $form['#submit'][] = 'canvas_menu_manager_page_data_submit';
+#[LegacyHook]
+function canvas_menu_manager_form_alter(array &$form, FormStateInterface $form_state, string $form_id): void
+{
+    \Drupal::service(CanvasMenuManagerHooks::class)->formAlter($form, $form_state, $form_id);
 }
 
 /**
diff --git a/canvas_menu_manager.services.yml b/canvas_menu_manager.services.yml
index 01b6844..bee2375 100644
--- a/canvas_menu_manager.services.yml
+++ b/canvas_menu_manager.services.yml
@@ -8,3 +8,7 @@ services:
     class: Drupal\canvas_menu_manager\Service\MenuLinkSyncService
     arguments:
       - '@entity_type.manager'
+
+  Drupal\canvas_menu_manager\Hook\CanvasMenuManagerHooks:
+    class: Drupal\canvas_menu_manager\Hook\CanvasMenuManagerHooks
+    autowire: true
diff --git a/src/Hook/CanvasMenuManagerHooks.php b/src/Hook/CanvasMenuManagerHooks.php
new file mode 100644
index 0000000..c715b89
--- /dev/null
+++ b/src/Hook/CanvasMenuManagerHooks.php
@@ -0,0 +1,135 @@
+<?php
+
+namespace Drupal\canvas_menu_manager\Hook;
+
+use Drupal\Core\Entity\ContentEntityFormInterface;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+/**
+ * Hook implementations for canvas_menu_manager.
+ */
+class CanvasMenuManagerHooks
+{
+    use StringTranslationTrait;
+    /**
+     * Implements hook_form_alter().
+     */
+    #[Hook('form_alter')]
+    public function formAlter(array &$form, \Drupal\Core\Form\FormStateInterface $form_state, string $form_id): void
+    {
+        if (!\Drupal::currentUser()->hasPermission('manage canvas menu items')) {
+            return;
+        }
+        $route_name = \Drupal::routeMatch()->getRouteName();
+        if ($route_name !== 'canvas.api.form.content_entity') {
+            return;
+        }
+        $form_object = $form_state->getFormObject();
+        if (!$form_object instanceof \Drupal\Core\Entity\ContentEntityFormInterface) {
+            return;
+        }
+        $entity = $form_object->getEntity();
+        if (!$entity instanceof \Drupal\Core\Entity\EntityInterface) {
+            return;
+        }
+        $menu_storage = \Drupal::entityTypeManager()->getStorage('menu');
+        $allowed_menus = \Drupal::config('canvas_menu_manager.settings')->get('allowed_menus');
+        $allowed_menus = is_array($allowed_menus) ? array_filter($allowed_menus) : [
+        ];
+        $menus = [
+        ];
+        foreach ($menu_storage->loadMultiple() as $menu) {
+            if ($allowed_menus !== [
+            ] && !in_array($menu->id(), $allowed_menus, TRUE)) {
+                continue;
+            }
+            $menus[$menu->id()] = $menu->label();
+        }
+        if ($menus === [
+        ]) {
+            return;
+        }
+        /** @var \Drupal\canvas_menu_manager\Service\MenuLinkSyncService $sync */
+        $sync = \Drupal::service('canvas_menu_manager.menu_link_sync');
+        $initial_values = $sync->getEntityMenuLinkValues($entity);
+        if (empty($initial_values['menu_name']) || !isset($menus[$initial_values['menu_name']])) {
+            $initial_values['menu_name'] = isset($menus['main']) ? 'main' : array_key_first($menus);
+        }
+        $form['canvas_menu_manager'] = [
+            '#type' => 'details',
+            '#title' => $this->t('Menu'),
+            '#weight' => 95,
+            '#open' => TRUE,
+            '#tree' => TRUE,
+            '#attributes' => [
+                'class' => [
+                    'canvas-menu-manager-panel',
+                ],
+            ],
+        ];
+        $form['canvas_menu_manager']['enabled'] = [
+            '#type' => 'hidden',
+            '#default_value' => (int) ($initial_values['enabled'] ?? 0),
+        ];
+        $form['canvas_menu_manager']['menu_name'] = [
+            '#type' => 'hidden',
+            '#default_value' => (string) ($initial_values['menu_name'] ?? (isset($menus['main']) ? 'main' : array_key_first($menus))),
+        ];
+        $form['canvas_menu_manager']['title'] = [
+            '#type' => 'hidden',
+            '#default_value' => (string) ($initial_values['title'] ?? $entity->label()),
+        ];
+        $form['canvas_menu_manager']['parent'] = [
+            '#type' => 'hidden',
+            '#default_value' => (string) ($initial_values['parent'] ?? ''),
+            '#attributes' => [
+                'data-cmm-field' => 'parent',
+                'data-track-hidden-value' => 'true',
+            ],
+        ];
+        $form['canvas_menu_manager']['weight'] = [
+            '#type' => 'hidden',
+            '#default_value' => (int) ($initial_values['weight'] ?? 0),
+            '#attributes' => [
+                'data-cmm-field' => 'weight',
+                'data-track-hidden-value' => 'true',
+            ],
+        ];
+        $form['canvas_menu_manager']['tree_json'] = [
+            '#type' => 'hidden',
+            '#default_value' => '[]',
+            '#attributes' => [
+                'data-cmm-field' => 'tree-json',
+                'data-track-hidden-value' => 'true',
+            ],
+        ];
+        $form['canvas_menu_manager']['touch'] = [
+            '#type' => 'hidden',
+            '#default_value' => '',
+            '#attributes' => [
+                'data-cmm-field' => 'touch',
+                'data-track-hidden-value' => 'true',
+            ],
+        ];
+        $form['canvas_menu_manager']['mount'] = [
+            '#type' => 'container',
+            '#attributes' => [
+                'id' => 'canvas-menu-manager-app',
+                'data-entity-type' => $entity->getEntityTypeId(),
+                'data-entity-id' => (string) $entity->id(),
+            ],
+        ];
+        $form['#attached']['library'][] = 'canvas_menu_manager/editor';
+        $form['#attached']['drupalSettings']['canvasMenuManager'] = [
+            'treeEndpoint' => '/canvas-menu/tree',
+            'linkSyncEndpoint' => '/canvas-menu/link-sync',
+            'menus' => $menus,
+            'entityType' => $entity->getEntityTypeId(),
+            'entityId' => (string) $entity->id(),
+            'initialValues' => $initial_values,
+        ];
+        $form['#submit'][] = 'canvas_menu_manager_page_data_submit';
+    }
+}
