From d7f723d6ad235c50d030b4d78e23b2ebbe0648c9 Mon Sep 17 00:00:00 2001
From: Harlor <harlor@web.de>
Date: Fri, 31 Jan 2025 15:18:38 +0100
Subject: [PATCH] Introduce form decorator attribute plugins

---
 .../src/FormDecorator/DependencyInjection.php |  6 ++--
 .../src/FormDecorator/NodeCreatedDate.php     |  6 ++--
 .../src/FormDecorator/ValidateOnly.php        |  8 ++---
 src/Attribute/FormDecorator.php               | 30 +++++++++++++++++++
 src/FormDecoratorPluginManager.php            |  5 ++--
 5 files changed, 40 insertions(+), 15 deletions(-)
 create mode 100644 src/Attribute/FormDecorator.php

diff --git a/modules/form_decorator_example/src/FormDecorator/DependencyInjection.php b/modules/form_decorator_example/src/FormDecorator/DependencyInjection.php
index 836ff81..84638b0 100644
--- a/modules/form_decorator_example/src/FormDecorator/DependencyInjection.php
+++ b/modules/form_decorator_example/src/FormDecorator/DependencyInjection.php
@@ -9,15 +9,13 @@ use Drupal\form_decorator\FormDecoratorBase;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
+use Drupal\form_decorator\Attribute\FormDecorator;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Adds dependency injection to the user login form.
- *
- * @FormDecorator(
- *   hook = "form_user_login_form_alter"
- * )
  */
+#[FormDecorator('form_user_login_form_alter')]
 final class DependencyInjection extends FormDecoratorBase implements ContainerFactoryPluginInterface {
 
   use StringTranslationTrait;
diff --git a/modules/form_decorator_example/src/FormDecorator/NodeCreatedDate.php b/modules/form_decorator_example/src/FormDecorator/NodeCreatedDate.php
index b475fcd..4b26adf 100644
--- a/modules/form_decorator_example/src/FormDecorator/NodeCreatedDate.php
+++ b/modules/form_decorator_example/src/FormDecorator/NodeCreatedDate.php
@@ -7,15 +7,13 @@ namespace Drupal\form_decorator_example\FormDecorator;
 use Drupal\Core\Datetime\DrupalDateTime;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\form_decorator\FormDecoratorBase;
+use Drupal\form_decorator\Attribute\FormDecorator;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 
 /**
  * Adds a created date picker to the node form.
- *
- * @FormDecorator(
- *   hook = "form_node_form_alter"
- * )
  */
+#[FormDecorator('form_node_form_alter')]
 final class NodeCreatedDate extends FormDecoratorBase {
 
   use StringTranslationTrait;
diff --git a/modules/form_decorator_example/src/FormDecorator/ValidateOnly.php b/modules/form_decorator_example/src/FormDecorator/ValidateOnly.php
index 4f35e16..430c434 100644
--- a/modules/form_decorator_example/src/FormDecorator/ValidateOnly.php
+++ b/modules/form_decorator_example/src/FormDecorator/ValidateOnly.php
@@ -5,16 +5,14 @@ declare(strict_types=1);
 namespace Drupal\form_decorator_example\FormDecorator;
 
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\form_decorator\FormDecoratorBase;
+use Drupal\form_decorator\Attribute\FormDecorator;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
 
 /**
  * Provides additional validation for the user registration form.
- *
- * @FormDecorator(
- *   hook = "form_user_register_form_alter"
- * )
  */
+#[FormDecorator('form_user_register_form_alter')]
 final class ValidateOnly extends FormDecoratorBase {
 
   use StringTranslationTrait;
diff --git a/src/Attribute/FormDecorator.php b/src/Attribute/FormDecorator.php
new file mode 100644
index 0000000..e3136bb
--- /dev/null
+++ b/src/Attribute/FormDecorator.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Drupal\form_decorator\Attribute;
+
+use Drupal\Component\Plugin\Attribute\Plugin;
+
+/**
+ * The FormDecorator attribute.
+ */
+#[\Attribute(\Attribute::TARGET_CLASS)]
+class FormDecorator extends Plugin {
+
+  /**
+   * Constructs a FormDecorator attribute.
+   *
+   * @param string $hook
+   *   The form alter hook.
+   */
+  public function __construct(
+    public readonly string $hook = '',
+  ) {}
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getId():string {
+    return $this->getClass();
+  }
+
+}
diff --git a/src/FormDecoratorPluginManager.php b/src/FormDecoratorPluginManager.php
index 8ffca4c..3f89280 100644
--- a/src/FormDecoratorPluginManager.php
+++ b/src/FormDecoratorPluginManager.php
@@ -7,7 +7,8 @@ namespace Drupal\form_decorator;
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Core\Plugin\DefaultPluginManager;
 use Drupal\Core\Extension\ModuleHandlerInterface;
-use Drupal\form_decorator\Annotation\FormDecorator;
+use Drupal\form_decorator\Attribute\FormDecorator;
+use Drupal\form_decorator\Annotation\FormDecorator as FormDecoratorAnnotation;
 
 /**
  * FormDecorator plugin manager.
@@ -18,7 +19,7 @@ final class FormDecoratorPluginManager extends DefaultPluginManager {
    * Constructs a new \Drupal\form_decorator\FormDecoratorPluginManager object.
    */
   public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler) {
-    parent::__construct('FormDecorator', $namespaces, $module_handler, FormDecoratorInterface::class, FormDecorator::class);
+    parent::__construct('FormDecorator', $namespaces, $module_handler, FormDecoratorInterface::class, FormDecorator::class, FormDecoratorAnnotation::class);
     $this->alterInfo('form_decorator_info');
     $this->setCacheBackend($cache_backend, 'form_decorator_plugins');
   }
-- 
GitLab