Refactor QuickFormInstanceManager to return config entities.

This commit is contained in:
Michael Stenta 2023-08-04 10:18:14 -04:00
parent 6e34a09a9f
commit 11c6e5be7e
7 changed files with 35 additions and 18 deletions

View File

@ -48,7 +48,7 @@ class QuickFormController extends ControllerBase {
* Returns a render array. * Returns a render array.
*/ */
public function index(): array { public function index(): array {
/** @var \Drupal\farm_quick\Plugin\QuickForm\QuickFormInterface[] $quick_forms */ /** @var \Drupal\farm_quick\Entity\QuickFormInstanceInterface[] $quick_forms */
$quick_forms = $this->quickFormInstanceManager->getInstances(); $quick_forms = $this->quickFormInstanceManager->getInstances();
$items = []; $items = [];
foreach ($quick_forms as $id => $quick_form) { foreach ($quick_forms as $id => $quick_form) {

View File

@ -63,7 +63,7 @@ class QuickForm extends FormBase implements BaseFormIdInterface {
$form_id = $this->getBaseFormId(); $form_id = $this->getBaseFormId();
$id = $this->getRouteMatch()->getParameter('id'); $id = $this->getRouteMatch()->getParameter('id');
if (!is_null($id)) { if (!is_null($id)) {
$form_id .= '_' . $this->quickFormInstanceManager->createInstance($id)->getFormId(); $form_id .= '_' . $this->quickFormInstanceManager->createInstance($id)->getPlugin()->getFormId();
} }
return $form_id; return $form_id;
} }
@ -93,7 +93,7 @@ class QuickForm extends FormBase implements BaseFormIdInterface {
* The access result. * The access result.
*/ */
public function access(AccountInterface $account, string $id) { public function access(AccountInterface $account, string $id) {
return $this->quickFormInstanceManager->createInstance($id)->access($account); return $this->quickFormInstanceManager->createInstance($id)->getPlugin()->access($account);
} }
/** /**
@ -105,9 +105,7 @@ class QuickForm extends FormBase implements BaseFormIdInterface {
$this->quickFormId = $id; $this->quickFormId = $id;
// Load the quick form. // Load the quick form.
/** @var \Drupal\farm_quick\Plugin\QuickForm\QuickFormInterface $quick_form */ $form = $this->quickFormInstanceManager->createInstance($id)->getPlugin()->buildForm($form, $form_state);
$quick_form = $this->quickFormInstanceManager->createInstance($id);
$form = $quick_form->buildForm($form, $form_state);
// Add a submit button, if one wasn't provided. // Add a submit button, if one wasn't provided.
if (empty($form['actions']['submit'])) { if (empty($form['actions']['submit'])) {
@ -128,14 +126,14 @@ class QuickForm extends FormBase implements BaseFormIdInterface {
* {@inheritdoc} * {@inheritdoc}
*/ */
public function validateForm(array &$form, FormStateInterface $form_state) { public function validateForm(array &$form, FormStateInterface $form_state) {
$this->quickFormInstanceManager->createInstance($this->quickFormId)->validateForm($form, $form_state); $this->quickFormInstanceManager->createInstance($this->quickFormId)->getPlugin()->validateForm($form, $form_state);
} }
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function submitForm(array &$form, FormStateInterface $form_state) { public function submitForm(array &$form, FormStateInterface $form_state) {
$this->quickFormInstanceManager->createInstance($this->quickFormId)->submitForm($form, $form_state); $this->quickFormInstanceManager->createInstance($this->quickFormId)->getPlugin()->submitForm($form, $form_state);
} }
} }

View File

@ -45,7 +45,7 @@ class QuickFormMenuLink extends DeriverBase implements ContainerDeriverInterface
$links = []; $links = [];
// Load quick forms. // Load quick forms.
/** @var \Drupal\farm_quick\Plugin\QuickForm\QuickFormInterface[] $quick_forms */ /** @var \Drupal\farm_quick\Entity\QuickFormInstanceInterface[] $quick_forms */
$quick_forms = $this->quickFormInstanceManager->getInstances(); $quick_forms = $this->quickFormInstanceManager->getInstances();
// Add a top level menu parent. // Add a top level menu parent.

View File

@ -3,6 +3,7 @@
namespace Drupal\farm_quick; namespace Drupal\farm_quick;
use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\farm_quick\Entity\QuickFormInstance;
use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\ContainerInterface;
/** /**
@ -56,8 +57,17 @@ class QuickFormInstanceManager implements QuickFormInstanceManagerInterface {
// Iterate through quick form plugin definitions. // Iterate through quick form plugin definitions.
foreach ($this->quickFormPluginManager->getDefinitions() as $plugin) { foreach ($this->quickFormPluginManager->getDefinitions() as $plugin) {
// Instantiate a quick form for the plugin. // Load quick form instance configuration entities for this plugin.
$instances[$plugin['id']] = $this->quickFormPluginManager->createInstance($plugin['id']); $entities = $this->entityTypeManager->getStorage('quick_form')->loadByProperties(['plugin' => $plugin['id']]);
if (!empty($entities)) {
$instances += $entities;
}
// If there are no config entities, create a new (unsaved) config entity
// with default values from the plugin.
else {
$instances[$plugin['id']] = QuickFormInstance::create(['id' => $plugin['id'], 'plugin' => $plugin['id']]);
}
} }
return $instances; return $instances;
@ -67,7 +77,16 @@ class QuickFormInstanceManager implements QuickFormInstanceManagerInterface {
* {@inheritdoc} * {@inheritdoc}
*/ */
public function createInstance($id) { public function createInstance($id) {
return $this->quickFormPluginManager->createInstance($id);
// First attempt to load a quick form instance config entity.
$entity = $this->entityTypeManager->getStorage('quick_form')->load($id);
if (!empty($entity)) {
return $entity;
}
// Otherwise, create a new (unsaved) config entity with default values from
// the plugin.
return QuickFormInstance::create(['id' => $id, 'plugin' => $id]);
} }
} }

View File

@ -10,10 +10,10 @@ interface QuickFormInstanceManagerInterface {
/** /**
* Get all quick form instances. * Get all quick form instances.
* *
* @return array * @return \Drupal\farm_quick\Entity\QuickFormInstanceInterface[]
* An array of quick form instances. * An array of quick form instances.
*/ */
public function getInstances(): array; public function getInstances();
/** /**
* Create an instance of a quick form. * Create an instance of a quick form.
@ -21,7 +21,7 @@ interface QuickFormInstanceManagerInterface {
* @param string $id * @param string $id
* The quick form ID. * The quick form ID.
* *
* @return \Drupal\farm_quick\Plugin\QuickForm\QuickFormInterface|null * @return \Drupal\farm_quick\Entity\QuickFormInstanceInterface|null
* Returns an instantiated quick form object. * Returns an instantiated quick form object.
*/ */
public function createInstance($id); public function createInstance($id);

View File

@ -48,7 +48,7 @@ class QuickFormRoutes implements ContainerInjectionInterface {
*/ */
public function routes(): RouteCollection { public function routes(): RouteCollection {
$route_collection = new RouteCollection(); $route_collection = new RouteCollection();
/** @var \Drupal\farm_quick\Plugin\QuickForm\QuickFormInterface[] $quick_forms */ /** @var \Drupal\farm_quick\Entity\QuickFormInstanceInterface[] $quick_forms */
$quick_forms = $this->quickFormInstanceManager->getInstances(); $quick_forms = $this->quickFormInstanceManager->getInstances();
foreach ($quick_forms as $id => $quick_form) { foreach ($quick_forms as $id => $quick_form) {
$route = new Route( $route = new Route(

View File

@ -62,7 +62,7 @@ class QuickFormTest extends KernelTestBase {
public function testQuickFormDiscovery() { public function testQuickFormDiscovery() {
// Load quick forms. // Load quick forms.
/** @var \Drupal\farm_quick\Plugin\QuickForm\QuickFormInterface[] $quick_forms */ /** @var \Drupal\farm_quick\Entity\QuickFormInstanceInterface[] $quick_forms */
$quick_forms = $this->quickFormInstanceManager->getInstances(); $quick_forms = $this->quickFormInstanceManager->getInstances();
// Confirm that one quick form was discovered. // Confirm that one quick form was discovered.
@ -72,7 +72,7 @@ class QuickFormTest extends KernelTestBase {
$this->assertEquals('Test quick form', $quick_forms['test']->getLabel()); $this->assertEquals('Test quick form', $quick_forms['test']->getLabel());
$this->assertEquals('Test quick form description.', $quick_forms['test']->getDescription()); $this->assertEquals('Test quick form description.', $quick_forms['test']->getDescription());
$this->assertEquals('Test quick form help text.', $quick_forms['test']->getHelpText()); $this->assertEquals('Test quick form help text.', $quick_forms['test']->getHelpText());
$this->assertEquals(['create test log'], $quick_forms['test']->getPermissions()); $this->assertEquals(['create test log'], $quick_forms['test']->getPlugin()->getPermissions());
} }
/** /**