diff --git a/composer.json b/composer.json
index d3e795a..33a434c 100644
--- a/composer.json
+++ b/composer.json
@@ -4,7 +4,7 @@
   "type": "drupal-module",
   "license": "GPL-2.0-or-later",
   "require": {
-    "drupal/core": "^10 || ^11"
+    "drupal/core": "^10.1 || ^11 || ^12"
   },
   "require-dev": { }
 }
diff --git a/entity_reference_validators.info.yml b/entity_reference_validators.info.yml
index 5b4fca4..a0b4b68 100644
--- a/entity_reference_validators.info.yml
+++ b/entity_reference_validators.info.yml
@@ -1,4 +1,4 @@
 name: Entity Reference validators
-core_version_requirement: ^10 || ^11
+core_version_requirement: ^10.1 || ^11 || ^12
 type: module
 description: 'Provides additional validators for entity reference fields.'
diff --git a/entity_reference_validators.module b/entity_reference_validators.module
index 33d8884..e7c7582 100644
--- a/entity_reference_validators.module
+++ b/entity_reference_validators.module
@@ -5,119 +5,25 @@
  * Provides additional validators for entity reference fields.
  */
 
-use Drupal\Core\Config\Entity\ThirdPartySettingsInterface;
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\entity_reference_validators\Hook\EntityReferenceValidatorsHooks;
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Form\FormStateInterface;
 
 /**
  * Implements hook_entity_bundle_field_info_alter().
  */
+#[LegacyHook]
 function entity_reference_validators_entity_bundle_field_info_alter(&$fields, EntityTypeInterface $entity_type, $bundle) {
-  /** @var \Drupal\field\Entity\FieldConfig $field */
-  foreach ($fields as $key => $field) {
-    if ($field instanceof ThirdPartySettingsInterface) {
-      if ($field->getThirdPartySetting(
-        'entity_reference_validators',
-        'circular_reference',
-        FALSE
-      )) {
-        $deep = $field->getThirdPartySetting(
-          'entity_reference_validators',
-          'circular_reference_deep',
-          FALSE
-        );
-        $field->addConstraint('CircularReference', ['deep' => $deep]);
-      }
-      if ($field->getThirdPartySetting(
-        'entity_reference_validators',
-        'duplicate_reference',
-        FALSE
-      )) {
-        $field->addConstraint('DuplicateReference');
-      }
-    }
-  }
+  \Drupal::service(EntityReferenceValidatorsHooks::class)->entityBundleFieldInfoAlter($fields, $entity_type, $bundle);
 }
 
 /**
  * Implements hook_form_FORM_ID_alter() for 'field_config_edit_form'.
  */
-function entity_reference_validators_form_field_config_edit_form_alter(
-  array &$form,
-  FormStateInterface $form_state,
-) {
-  /** @var \Drupal\field\Entity\FieldConfig $field */
-  $field = $form_state->getFormObject()->getEntity();
-
-  if ($field->getType(
-    ) === 'entity_reference' && $field instanceof ThirdPartySettingsInterface) {
-    // Add a fieldset for the validators.
-    $form['third_party_settings']['entity_reference_validators']['container'] = [
-      '#type' => 'details',
-      '#title' => t('Reference validators'),
-      '#open' => TRUE,
-    ];
-
-    $form['third_party_settings']['entity_reference_validators']['container']['circular_reference'] = [
-      '#type' => 'checkbox',
-      '#title' => t('Prevent circular references'),
-      '#default_value' => $field->getThirdPartySetting(
-        'entity_reference_validators',
-        'circular_reference',
-        FALSE
-      ),
-      '#parents' => [
-        'third_party_settings',
-        'entity_reference_validators',
-        'circular_reference',
-      ],
-      // Only check for circular references when the target type is the same as
-      // the field's.
-      '#access' => $field->getTargetEntityTypeId(
-      ) === $field->getItemDefinition()->getSetting('target_type'),
-    ];
-
-    $form['third_party_settings']['entity_reference_validators']['container']['circular_reference_deep'] = [
-      '#type' => 'checkbox',
-      '#title' => t('Recursively check circular references'),
-      '#default_value' => $field->getThirdPartySetting(
-        'entity_reference_validators',
-        'circular_reference_deep',
-        FALSE
-      ),
-      '#parents' => [
-        'third_party_settings',
-        'entity_reference_validators',
-        'circular_reference_deep',
-      ],
-      // Only check for circular references when the target type is the same as
-      // the field's.
-      '#access' => $field->getTargetEntityTypeId(
-      ) === $field->getItemDefinition()->getSetting('target_type'),
-      '#states' => [
-        // Hide the additional settings when circular_reference is disabled.
-        'visible' => [
-          'input[name="third_party_settings[entity_reference_validators][circular_reference]"]' => ['checked' => TRUE],
-        ],
-      ],
-      '#element_validate' => ['_entity_reference_validators_circular_reference_deep_checkbox_validate'],
-    ];
-
-    $form['third_party_settings']['entity_reference_validators']['container']['duplicate_reference'] = [
-      '#type' => 'checkbox',
-      '#title' => t('Prevent entity from referencing duplicates'),
-      '#default_value' => $field->getThirdPartySetting(
-        'entity_reference_validators',
-        'duplicate_reference',
-        FALSE
-      ),
-      '#parents' => [
-        'third_party_settings',
-        'entity_reference_validators',
-        'duplicate_reference',
-      ],
-    ];
-  }
+#[LegacyHook]
+function entity_reference_validators_form_field_config_edit_form_alter(array &$form, FormStateInterface $form_state) {
+  \Drupal::service(EntityReferenceValidatorsHooks::class)->formFieldConfigEditFormAlter($form, $form_state);
 }
 
 /**
diff --git a/entity_reference_validators.services.yml b/entity_reference_validators.services.yml
new file mode 100644
index 0000000..f62986c
--- /dev/null
+++ b/entity_reference_validators.services.yml
@@ -0,0 +1,5 @@
+
+services:
+  Drupal\entity_reference_validators\Hook\EntityReferenceValidatorsHooks:
+    class: Drupal\entity_reference_validators\Hook\EntityReferenceValidatorsHooks
+    autowire: true
diff --git a/src/Hook/EntityReferenceValidatorsHooks.php b/src/Hook/EntityReferenceValidatorsHooks.php
new file mode 100644
index 0000000..a6e7d72
--- /dev/null
+++ b/src/Hook/EntityReferenceValidatorsHooks.php
@@ -0,0 +1,102 @@
+<?php
+
+namespace Drupal\entity_reference_validators\Hook;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Config\Entity\ThirdPartySettingsInterface;
+use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for entity_reference_validators.
+ */
+class EntityReferenceValidatorsHooks {
+  use StringTranslationTrait;
+
+  /**
+   * Implements hook_entity_bundle_field_info_alter().
+   */
+  #[Hook('entity_bundle_field_info_alter')]
+  public static function entityBundleFieldInfoAlter(&$fields, EntityTypeInterface $entity_type, $bundle) {
+    /** @var \Drupal\field\Entity\FieldConfig $field */
+    foreach ($fields as $key => $field) {
+      if ($field instanceof ThirdPartySettingsInterface) {
+        if ($field->getThirdPartySetting('entity_reference_validators', 'circular_reference', FALSE)) {
+          $deep = $field->getThirdPartySetting('entity_reference_validators', 'circular_reference_deep', FALSE);
+          $field->addConstraint('CircularReference', [
+            'deep' => $deep,
+          ]);
+        }
+        if ($field->getThirdPartySetting('entity_reference_validators', 'duplicate_reference', FALSE)) {
+          $field->addConstraint('DuplicateReference');
+        }
+      }
+    }
+  }
+
+  /**
+   * Implements hook_form_FORM_ID_alter() for 'field_config_edit_form'.
+   */
+  #[Hook('form_field_config_edit_form_alter')]
+  public function formFieldConfigEditFormAlter(array &$form, FormStateInterface $form_state) {
+    /** @var \Drupal\field\Entity\FieldConfig $field */
+    $field = $form_state->getFormObject()->getEntity();
+    if ($field->getType() === 'entity_reference' && $field instanceof ThirdPartySettingsInterface) {
+      // Add a fieldset for the validators.
+      $form['third_party_settings']['entity_reference_validators']['container'] = [
+        '#type' => 'details',
+        '#title' => $this->t('Reference validators'),
+        '#open' => TRUE,
+      ];
+      $form['third_party_settings']['entity_reference_validators']['container']['circular_reference'] = [
+        '#type' => 'checkbox',
+        '#title' => $this->t('Prevent circular references'),
+        '#default_value' => $field->getThirdPartySetting('entity_reference_validators', 'circular_reference', FALSE),
+        '#parents' => [
+          'third_party_settings',
+          'entity_reference_validators',
+          'circular_reference',
+        ],
+            // Only check for circular references when the target type is the same as
+            // the field's.
+        '#access' => $field->getTargetEntityTypeId() === $field->getItemDefinition()->getSetting('target_type'),
+      ];
+      $form['third_party_settings']['entity_reference_validators']['container']['circular_reference_deep'] = [
+        '#type' => 'checkbox',
+        '#title' => $this->t('Recursively check circular references'),
+        '#default_value' => $field->getThirdPartySetting('entity_reference_validators', 'circular_reference_deep', FALSE),
+        '#parents' => [
+          'third_party_settings',
+          'entity_reference_validators',
+          'circular_reference_deep',
+        ],
+            // Only check for circular references when the target type is the same as
+            // the field's.
+        '#access' => $field->getTargetEntityTypeId() === $field->getItemDefinition()->getSetting('target_type'),
+        '#states' => [
+                // Hide the additional settings when circular_reference is disabled.
+          'visible' => [
+            'input[name="third_party_settings[entity_reference_validators][circular_reference]"]' => [
+              'checked' => TRUE,
+            ],
+          ],
+        ],
+        '#element_validate' => [
+          '_entity_reference_validators_circular_reference_deep_checkbox_validate',
+        ],
+      ];
+      $form['third_party_settings']['entity_reference_validators']['container']['duplicate_reference'] = [
+        '#type' => 'checkbox',
+        '#title' => $this->t('Prevent entity from referencing duplicates'),
+        '#default_value' => $field->getThirdPartySetting('entity_reference_validators', 'duplicate_reference', FALSE),
+        '#parents' => [
+          'third_party_settings',
+          'entity_reference_validators',
+          'duplicate_reference',
+        ],
+      ];
+    }
+  }
+
+}
