diff --git a/core/core.services.yml b/core/core.services.yml index 9c3f606..e72def5 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -628,7 +628,6 @@ services: arguments: ['@authentication', '@current_user'] route_enhancer.entity: class: Drupal\Core\Entity\Enhancer\EntityRouteEnhancer - arguments: ['@controller_resolver', '@entity.manager', '@form_builder'] tags: - { name: route_enhancer, priority: 20 } route_content_controller_subscriber: @@ -636,12 +635,6 @@ services: arguments: ['@content_negotiation'] tags: - { name: event_subscriber } - route_content_form_controller_subscriber: - class: Drupal\Core\EventSubscriber\ContentFormControllerSubscriber - arguments: ['@class_resolver', '@controller_resolver', '@form_builder'] - parent: container.trait - tags: - - { name: event_subscriber } route_special_attributes_subscriber: class: Drupal\Core\EventSubscriber\SpecialAttributesRouteSubscriber tags: @@ -659,6 +652,12 @@ services: controller.dialog: class: Drupal\Core\Controller\DialogController arguments: ['@controller_resolver', '@title_resolver'] + controller.form: + class: Drupal\Core\Controller\HtmlFormController + arguments: ['@controller_resolver', '@form_builder', '@class_resolver'] + controller.entity_form: + class: Drupal\Core\Entity\HtmlEntityFormController + arguments: ['@controller_resolver', '@form_builder', '@entity.manager'] router_listener: class: Symfony\Component\HttpKernel\EventListener\RouterListener tags: diff --git a/core/lib/Drupal/Core/Controller/FormController.php b/core/lib/Drupal/Core/Controller/FormController.php index a9b7a08..251312f 100644 --- a/core/lib/Drupal/Core/Controller/FormController.php +++ b/core/lib/Drupal/Core/Controller/FormController.php @@ -19,12 +19,6 @@ */ abstract class FormController { use DependencySerializationTrait; - /** - * The form definition. The format may vary depending on the child class. - * - * @var string - */ - protected $formDefinition; /** * The controller resolver. @@ -63,14 +57,15 @@ public function __construct(ControllerResolverInterface $controller_resolver, Fo * The render array that results from invoking the controller. */ public function getContentResult(Request $request) { - $form_object = $this->getFormObject($request, $this->formDefinition); + $form_definition = $this->getFormDefinition($request); + $form_object = $this->getFormObject($request, $form_definition); // Add the form and form_state to trick the getArguments method of the // controller resolver. $form_state = new FormState(); - $request->attributes->set('form', array()); + $request->attributes->set('form', []); $request->attributes->set('form_state', $form_state); - $args = $this->controllerResolver->getArguments($request, array($form_object, 'buildForm')); + $args = $this->controllerResolver->getArguments($request, [$form_object, 'buildForm']); $request->attributes->remove('form'); $request->attributes->remove('form_state'); @@ -81,6 +76,20 @@ public function getContentResult(Request $request) { return $this->formBuilder->buildForm($form_object, $form_state); } + + /** + * Extracts the form definition string from a request. + * + * Depending on the type of form the definition string may be stored in a + * different request attribute. + * + * @param \Symfony\Component\HttpFoundation\Request $request + * The request object from which to extract a form definition string. + * @return string + * The form definition string. + */ + abstract protected function getFormDefinition(Request $request); + /** * Returns the object used to build the form. * diff --git a/core/lib/Drupal/Core/Controller/HtmlFormController.php b/core/lib/Drupal/Core/Controller/HtmlFormController.php index 5951b32..ecfa6a1 100644 --- a/core/lib/Drupal/Core/Controller/HtmlFormController.php +++ b/core/lib/Drupal/Core/Controller/HtmlFormController.php @@ -19,13 +19,6 @@ class HtmlFormController extends FormController { /** - * The injection container for this object. - * - * @var \Symfony\Component\DependencyInjection\ContainerInterface - */ - protected $container; - - /** * The name of a class implementing FormInterface that defines a form. * * @var string @@ -42,11 +35,16 @@ class HtmlFormController extends FormController { /** * Constructs a new \Drupal\Core\Routing\Enhancer\FormEnhancer object. */ - public function __construct(ClassResolverInterface $class_resolver, ControllerResolverInterface $controller_resolver, ContainerInterface $container, $class, FormBuilderInterface $form_builder) { + public function __construct(ControllerResolverInterface $controller_resolver, FormBuilderInterface $form_builder, ClassResolverInterface $class_resolver) { parent::__construct($controller_resolver, $form_builder); $this->classResolver = $class_resolver; - $this->container = $container; - $this->formDefinition = $class; + } + + /** + * @{inheritDoc} + */ + protected function getFormDefinition(Request $request) { + return $request->attributes->get('_form'); } /** diff --git a/core/lib/Drupal/Core/Entity/Enhancer/EntityRouteEnhancer.php b/core/lib/Drupal/Core/Entity/Enhancer/EntityRouteEnhancer.php index 0bbbef8..612512f 100644 --- a/core/lib/Drupal/Core/Entity/Enhancer/EntityRouteEnhancer.php +++ b/core/lib/Drupal/Core/Entity/Enhancer/EntityRouteEnhancer.php @@ -7,10 +7,6 @@ namespace Drupal\Core\Entity\Enhancer; -use Drupal\Core\Controller\ControllerResolverInterface; -use Drupal\Core\Entity\EntityManagerInterface; -use Drupal\Core\Entity\HtmlEntityFormController; -use Drupal\Core\Form\FormBuilderInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface; use Symfony\Cmf\Component\Routing\RouteObjectInterface; @@ -21,50 +17,12 @@ class EntityRouteEnhancer implements RouteEnhancerInterface { /** - * The controller resolver. - * - * @var \Drupal\Core\Controller\ControllerResolverInterface - */ - protected $resolver; - - /** - * The entity manager service. - * - * @var \Drupal\Core\Entity\EntityManagerInterface - */ - protected $manager; - - /** - * The form builder. - * - * @var \Drupal\Core\Form\FormBuilderInterface - */ - protected $formBuilder; - - /** - * Constructs a new EntityRouteEnhancer object. - * - * @param \Drupal\Core\Controller\ControllerResolverInterface $resolver - * The controller resolver. - * @param \Drupal\Core\Entity\EntityManagerInterface $manager - * The entity manager. - * @param \Drupal\Core\Form\FormBuilderInterface $form_builder - * The form builder. - */ - public function __construct(ControllerResolverInterface $resolver, EntityManagerInterface $manager, FormBuilderInterface $form_builder) { - $this->resolver = $resolver; - $this->manager = $manager; - $this->formBuilder = $form_builder; - } - - /** * {@inheritdoc} */ public function enhance(array $defaults, Request $request) { if (empty($defaults['_content'])) { if (!empty($defaults['_entity_form'])) { - $wrapper = new HtmlEntityFormController($this->resolver, $this->manager, $this->formBuilder, $defaults['_entity_form']); - $defaults['_content'] = array($wrapper, 'getContentResult'); + $defaults['_content'] = 'controller.entity_form:getContentResult'; } elseif (!empty($defaults['_entity_list'])) { $defaults['_content'] = '\Drupal\Core\Entity\Controller\EntityListController::listing'; diff --git a/core/lib/Drupal/Core/Entity/HtmlEntityFormController.php b/core/lib/Drupal/Core/Entity/HtmlEntityFormController.php index e575e65..db658e6 100644 --- a/core/lib/Drupal/Core/Entity/HtmlEntityFormController.php +++ b/core/lib/Drupal/Core/Entity/HtmlEntityFormController.php @@ -10,6 +10,7 @@ use Drupal\Core\Controller\ControllerResolverInterface; use Drupal\Core\Controller\FormController; use Drupal\Core\Form\FormBuilderInterface; +use Drupal\Core\Form\FormState; use Symfony\Component\HttpFoundation\Request; /** @@ -29,17 +30,21 @@ class HtmlEntityFormController extends FormController { * * @param \Drupal\Core\Controller\ControllerResolverInterface $resolver * The controller resolver. - * @param \Drupal\Core\Entity\EntityManagerInterface $manager - * The entity manager. * @param \Drupal\Core\Form\FormBuilderInterface $form_builder * The form builder. - * @param string $form_definition - * The definition of this form, usually found in $defaults['_entity_form']. + * @param \Drupal\Core\Entity\EntityManagerInterface $manager + * The entity manager. */ - public function __construct(ControllerResolverInterface $resolver, EntityManagerInterface $manager, FormBuilderInterface $form_builder, $form_definition) { + public function __construct(ControllerResolverInterface $resolver, FormBuilderInterface $form_builder, EntityManagerInterface $manager) { parent::__construct($resolver, $form_builder); $this->manager = $manager; - $this->formDefinition = $form_definition; + } + + /** + * @{inheritDoc} + */ + protected function getFormDefinition(Request $request) { + return $request->attributes->get('_entity_form'); } /** @@ -71,7 +76,7 @@ protected function getFormObject(Request $request, $form_arg) { $entity = $request->attributes->get($entity_type); } else { - $entity = $this->manager->getStorage($entity_type)->create(array()); + $entity = $this->manager->getStorage($entity_type)->create([]); } return $this->manager->getFormObject($entity_type, $operation)->setEntity($entity); diff --git a/core/lib/Drupal/Core/EventSubscriber/ContentControllerSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/ContentControllerSubscriber.php index 377ae93..73b17c1 100644 --- a/core/lib/Drupal/Core/EventSubscriber/ContentControllerSubscriber.php +++ b/core/lib/Drupal/Core/EventSubscriber/ContentControllerSubscriber.php @@ -78,6 +78,20 @@ public function onRequestDeriveContentWrapper(GetResponseEvent $event) { } /** + * Sets the _controller on a request based on the request format. + * + * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event + * The event to process. + */ + public function onRequestDeriveFormWrapper(GetResponseEvent $event) { + $request = $event->getRequest(); + + if ($form = $request->attributes->get('_form')) { + $request->attributes->set('_content', 'controller.form:getContentResult'); + } + } + + /** * Registers the methods in this class that should be listeners. * * @return array @@ -86,6 +100,7 @@ public function onRequestDeriveContentWrapper(GetResponseEvent $event) { static function getSubscribedEvents() { $events[KernelEvents::REQUEST][] = array('onRequestDeriveFormat', 31); $events[KernelEvents::REQUEST][] = array('onRequestDeriveContentWrapper', 30); + $events[KernelEvents::REQUEST][] = array('onRequestDeriveFormWrapper', 29); return $events; } diff --git a/core/lib/Drupal/Core/EventSubscriber/ContentFormControllerSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/ContentFormControllerSubscriber.php deleted file mode 100644 index 43bdd8b..0000000 --- a/core/lib/Drupal/Core/EventSubscriber/ContentFormControllerSubscriber.php +++ /dev/null @@ -1,83 +0,0 @@ -classResolver = $class_resolver; - $this->controllerResolver = $controller_resolver; - $this->formBuilder = $form_builder; - } - - /** - * Sets the _controller on a request based on the request format. - * - * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event - * The event to process. - */ - public function onRequestDeriveFormWrapper(GetResponseEvent $event) { - $request = $event->getRequest(); - - if ($form = $request->attributes->get('_form')) { - $wrapper = new HtmlFormController($this->classResolver, $this->controllerResolver, $this->container, $form, $this->formBuilder); - $request->attributes->set('_content', array($wrapper, 'getContentResult')); - } - } - - /** - * Registers the methods in this class that should be listeners. - * - * @return array - * An array of event listener definitions. - */ - static function getSubscribedEvents() { - $events[KernelEvents::REQUEST][] = array('onRequestDeriveFormWrapper', 29); - - return $events; - } -} diff --git a/core/tests/Drupal/Tests/Core/Entity/Enhancer/EntityRouteEnhancerTest.php b/core/tests/Drupal/Tests/Core/Entity/Enhancer/EntityRouteEnhancerTest.php index 3727a06..1f26283 100644 --- a/core/tests/Drupal/Tests/Core/Entity/Enhancer/EntityRouteEnhancerTest.php +++ b/core/tests/Drupal/Tests/Core/Entity/Enhancer/EntityRouteEnhancerTest.php @@ -24,11 +24,7 @@ class EntityRouteEnhancerTest extends UnitTestCase { * @see \Drupal\Core\Entity\Enhancer\EntityRouteEnhancer::enhancer() */ public function testEnhancer() { - $controller_resolver = $this->getMock('Drupal\Core\Controller\ControllerResolverInterface'); - $entity_manager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface'); - $form_builder = $this->getMock('Drupal\Core\Form\FormBuilderInterface'); - - $route_enhancer = new EntityRouteEnhancer($controller_resolver, $entity_manager, $form_builder); + $route_enhancer = new EntityRouteEnhancer(); // Set a controller to ensure it is not overridden. $request = new Request(); @@ -36,18 +32,14 @@ public function testEnhancer() { $defaults['_controller'] = 'Drupal\Tests\Core\Controller\TestController::content'; $defaults['_entity_form'] = 'entity_test.default'; $new_defaults = $route_enhancer->enhance($defaults, $request); - $this->assertTrue(is_callable($new_defaults['_content'])); - $this->assertInstanceOf('\Drupal\Core\Entity\HtmlEntityFormController', $new_defaults['_content'][0]); - $this->assertEquals($new_defaults['_content'][1], 'getContentResult'); + $this->assertEquals('controller.entity_form:getContentResult', $new_defaults['_content']); $this->assertEquals($defaults['_controller'], $new_defaults['_controller'], '_controller got overridden.'); // Set _entity_form and ensure that the form is set. $defaults = array(); $defaults['_entity_form'] = 'entity_test.default'; $new_defaults = $route_enhancer->enhance($defaults, $request); - $this->assertTrue(is_callable($new_defaults['_content'])); - $this->assertInstanceOf('\Drupal\Core\Entity\HtmlEntityFormController', $new_defaults['_content'][0]); - $this->assertEquals($new_defaults['_content'][1], 'getContentResult'); + $this->assertEquals('controller.entity_form:getContentResult', $new_defaults['_content']); // Set _entity_list and ensure that the entity list controller is set. $defaults = array();