123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- <?php
- namespace Drupal\Core\Entity\Enhancer;
- use Drupal\Core\Routing\EnhancerInterface;
- use Symfony\Component\HttpFoundation\Request;
- use Symfony\Cmf\Component\Routing\RouteObjectInterface;
- use Symfony\Component\Routing\Route;
- /**
- * Enhances an entity form route with the appropriate controller.
- */
- class EntityRouteEnhancer implements EnhancerInterface {
- /**
- * {@inheritdoc}
- */
- public function enhance(array $defaults, Request $request) {
- $route = $defaults[RouteObjectInterface::ROUTE_OBJECT];
- if (!$this->applies($route)) {
- return $defaults;
- }
- if (empty($defaults['_controller'])) {
- if (!empty($defaults['_entity_form'])) {
- $defaults = $this->enhanceEntityForm($defaults, $request);
- }
- elseif (!empty($defaults['_entity_list'])) {
- $defaults = $this->enhanceEntityList($defaults, $request);
- }
- elseif (!empty($defaults['_entity_view'])) {
- $defaults = $this->enhanceEntityView($defaults, $request);
- }
- }
- return $defaults;
- }
- /**
- * Returns whether the enhancer runs on the current route.
- *
- * @param \Symfony\Component\Routing\Route $route
- * The current route.
- *
- * @return bool
- */
- protected function applies(Route $route) {
- return !$route->hasDefault('_controller') &&
- ($route->hasDefault('_entity_form')
- || $route->hasDefault('_entity_list')
- || $route->hasDefault('_entity_view')
- );
- }
- /**
- * Update defaults for entity forms.
- *
- * @param array $defaults
- * The defaults to modify.
- * @param \Symfony\Component\HttpFoundation\Request $request
- * The Request instance.
- *
- * @return array
- * The modified defaults.
- */
- protected function enhanceEntityForm(array $defaults, Request $request) {
- $defaults['_controller'] = 'controller.entity_form:getContentResult';
- return $defaults;
- }
- /**
- * Update defaults for an entity list.
- *
- * @param array $defaults
- * The defaults to modify.
- * @param \Symfony\Component\HttpFoundation\Request $request
- * The Request instance.
- *
- * @return array
- * The modified defaults.
- */
- protected function enhanceEntityList(array $defaults, Request $request) {
- $defaults['_controller'] = '\Drupal\Core\Entity\Controller\EntityListController::listing';
- $defaults['entity_type'] = $defaults['_entity_list'];
- unset($defaults['_entity_list']);
- return $defaults;
- }
- /**
- * Update defaults for an entity view.
- *
- * @param array $defaults
- * The defaults to modify.
- * @param \Symfony\Component\HttpFoundation\Request $request
- * The Request instance.
- *
- * @return array
- * The modified defaults.
- *
- * @throws \RuntimeException
- * Thrown when an entity of a type cannot be found in a route.
- */
- protected function enhanceEntityView(array $defaults, Request $request) {
- $defaults['_controller'] = '\Drupal\Core\Entity\Controller\EntityViewController::view';
- if (strpos($defaults['_entity_view'], '.') !== FALSE) {
- // The _entity_view entry is of the form entity_type.view_mode.
- list($entity_type, $view_mode) = explode('.', $defaults['_entity_view']);
- $defaults['view_mode'] = $view_mode;
- }
- else {
- // Only the entity type is nominated, the view mode will use the
- // default.
- $entity_type = $defaults['_entity_view'];
- }
- // Set by reference so that we get the upcast value.
- if (!empty($defaults[$entity_type])) {
- $defaults['_entity'] = &$defaults[$entity_type];
- }
- else {
- // The entity is not keyed by its entity_type. Attempt to find it
- // using a converter.
- $route = $defaults[RouteObjectInterface::ROUTE_OBJECT];
- if ($route && is_object($route)) {
- $options = $route->getOptions();
- if (isset($options['parameters'])) {
- foreach ($options['parameters'] as $name => $details) {
- if (!empty($details['type'])) {
- $type = $details['type'];
- // Type is of the form entity:{entity_type}.
- $parameter_entity_type = substr($type, strlen('entity:'));
- if ($entity_type == $parameter_entity_type) {
- // We have the matching entity type. Set the '_entity' key
- // to point to this named placeholder. The entity in this
- // position is the one being rendered.
- $defaults['_entity'] = &$defaults[$name];
- }
- }
- }
- }
- else {
- throw new \RuntimeException(sprintf('Failed to find entity of type %s in route named %s', $entity_type, $defaults[RouteObjectInterface::ROUTE_NAME]));
- }
- }
- else {
- throw new \RuntimeException(sprintf('Failed to find entity of type %s in route named %s', $entity_type, $defaults[RouteObjectInterface::ROUTE_NAME]));
- }
- }
- unset($defaults['_entity_view']);
- return $defaults;
- }
- }
|