3 namespace Drupal\Core\Plugin;
5 use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException;
6 use Drupal\Component\Plugin\PluginAwareInterface;
7 use Drupal\Core\DependencyInjection\ClassResolverInterface;
10 * Provides form discovery capabilities for plugins.
12 class PluginFormFactory implements PluginFormFactoryInterface {
17 * @var \Drupal\Core\DependencyInjection\ClassResolverInterface
19 protected $classResolver;
22 * PluginFormFactory constructor.
24 * @param \Drupal\Core\DependencyInjection\ClassResolverInterface $class_resolver
27 public function __construct(ClassResolverInterface $class_resolver) {
28 $this->classResolver = $class_resolver;
34 public function createInstance(PluginWithFormsInterface $plugin, $operation, $fallback_operation = NULL) {
35 if (!$plugin->hasFormClass($operation)) {
36 // Use the default form class if no form is specified for this operation.
37 if ($fallback_operation && $plugin->hasFormClass($fallback_operation)) {
38 $operation = $fallback_operation;
41 throw new InvalidPluginDefinitionException($plugin->getPluginId(), sprintf('The "%s" plugin did not specify a "%s" form class', $plugin->getPluginId(), $operation));
45 $form_class = $plugin->getFormClass($operation);
47 // If the form specified is the plugin itself, use it directly.
48 if (ltrim(get_class($plugin), '\\') === ltrim($form_class, '\\')) {
49 $form_object = $plugin;
52 $form_object = $this->classResolver->getInstanceFromDefinition($form_class);
55 // Ensure the resulting object is a plugin form.
56 if (!$form_object instanceof PluginFormInterface) {
57 throw new InvalidPluginDefinitionException($plugin->getPluginId(), sprintf('The "%s" plugin did not specify a valid "%s" form class, must implement \Drupal\Core\Plugin\PluginFormInterface', $plugin->getPluginId(), $operation));
60 if ($form_object instanceof PluginAwareInterface) {
61 $form_object->setPlugin($plugin);