Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
28.57% |
2 / 7 |
CRAP | |
28.81% |
17 / 59 |
| DefaultHtmlRouteProvider | |
0.00% |
0 / 1 |
|
28.57% |
2 / 7 |
149.23 | |
28.81% |
17 / 59 |
| __construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| createInstance | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| getRoutes | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 9 |
|||
| getCanonicalRoute | |
100.00% |
1 / 1 |
4 | |
100.00% |
13 / 13 |
|||
| getEditFormRoute | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 16 |
|||
| getDeleteFormRoute | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 13 |
|||
| getEntityTypeIdKeyType | |
100.00% |
1 / 1 |
2 | |
100.00% |
4 / 4 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\Core\Entity\Routing\DefaultHtmlRouteProvider. | |
| */ | |
| namespace Drupal\Core\Entity\Routing; | |
| use Drupal\Core\Entity\EntityHandlerInterface; | |
| use Drupal\Core\Entity\EntityManagerInterface; | |
| use Drupal\Core\Entity\EntityTypeInterface; | |
| use Drupal\Core\Entity\FieldableEntityInterface; | |
| use Symfony\Component\DependencyInjection\ContainerInterface; | |
| use Symfony\Component\Routing\Route; | |
| use Symfony\Component\Routing\RouteCollection; | |
| /** | |
| * Provides HTML routes for entities. | |
| * | |
| * This class provides the following routes for entities, with title and access | |
| * callbacks: | |
| * - canonical | |
| * - edit-form | |
| * - delete-form | |
| * | |
| * @see \Drupal\Core\Entity\Routing\AdminHtmlRouteProvider. | |
| * | |
| * @internal | |
| */ | |
| class DefaultHtmlRouteProvider implements EntityRouteProviderInterface, EntityHandlerInterface { | |
| /** | |
| * The entity manager. | |
| * | |
| * @var \Drupal\Core\Entity\EntityManagerInterface | |
| */ | |
| protected $entityManager; | |
| /** | |
| * Constructs a new DefaultHtmlRouteProvider. | |
| * | |
| * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager | |
| * The entity manager. | |
| */ | |
| public function __construct(EntityManagerInterface $entity_manager) { | |
| $this->entityManager = $entity_manager; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) { | |
| return new static( | |
| $container->get('entity.manager') | |
| ); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getRoutes(EntityTypeInterface $entity_type) { | |
| $collection = new RouteCollection(); | |
| $entity_type_id = $entity_type->id(); | |
| if ($edit_route = $this->getEditFormRoute($entity_type)) { | |
| $collection->add("entity.{$entity_type_id}.edit_form", $edit_route); | |
| } | |
| if ($canonical_route = $this->getCanonicalRoute($entity_type)) { | |
| $collection->add("entity.{$entity_type_id}.canonical", $canonical_route); | |
| } | |
| if ($delete_route = $this->getDeleteFormRoute($entity_type)) { | |
| $collection->add("entity.{$entity_type_id}.delete_form", $delete_route); | |
| } | |
| return $collection; | |
| } | |
| /** | |
| * Gets the canonical route. | |
| * | |
| * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type | |
| * The entity type. | |
| * | |
| * @return \Symfony\Component\Routing\Route|null | |
| * The generated route, if available. | |
| */ | |
| protected function getCanonicalRoute(EntityTypeInterface $entity_type) { | |
| if ($entity_type->hasLinkTemplate('canonical') && $entity_type->hasViewBuilderClass()) { | |
| $entity_type_id = $entity_type->id(); | |
| $route = new Route($entity_type->getLinkTemplate('canonical')); | |
| $route | |
| ->addDefaults([ | |
| '_entity_view' => "{$entity_type_id}.full", | |
| '_title_callback' => '\Drupal\Core\Entity\Controller\EntityController::title', | |
| ]) | |
| ->setRequirement('_entity_access', "{$entity_type_id}.view") | |
| ->setOption('parameters', [ | |
| $entity_type_id => ['type' => 'entity:' . $entity_type_id], | |
| ]); | |
| // Entity types with serial IDs can specify this in their route | |
| // requirements, improving the matching process. | |
| if ($this->getEntityTypeIdKeyType($entity_type) === 'integer') { | |
| $route->setRequirement($entity_type_id, '\d+'); | |
| } | |
| return $route; | |
| } | |
| } | |
| /** | |
| * Gets the edit-form route. | |
| * | |
| * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type | |
| * The entity type. | |
| * | |
| * @return \Symfony\Component\Routing\Route|null | |
| * The generated route, if available. | |
| */ | |
| protected function getEditFormRoute(EntityTypeInterface $entity_type) { | |
| if ($entity_type->hasLinkTemplate('edit-form')) { | |
| $entity_type_id = $entity_type->id(); | |
| $route = new Route($entity_type->getLinkTemplate('edit-form')); | |
| // Use the edit form handler, if available, otherwise default. | |
| $operation = 'default'; | |
| if ($entity_type->getFormClass('edit')) { | |
| $operation = 'edit'; | |
| } | |
| $route | |
| ->setDefaults([ | |
| '_entity_form' => "{$entity_type_id}.{$operation}", | |
| '_title_callback' => '\Drupal\Core\Entity\Controller\EntityController::editTitle' | |
| ]) | |
| ->setRequirement('_entity_access', "{$entity_type_id}.update") | |
| ->setOption('parameters', [ | |
| $entity_type_id => ['type' => 'entity:' . $entity_type_id], | |
| ]); | |
| // Entity types with serial IDs can specify this in their route | |
| // requirements, improving the matching process. | |
| if ($this->getEntityTypeIdKeyType($entity_type) === 'integer') { | |
| $route->setRequirement($entity_type_id, '\d+'); | |
| } | |
| return $route; | |
| } | |
| } | |
| /** | |
| * Gets the delete-form route. | |
| * | |
| * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type | |
| * The entity type. | |
| * | |
| * @return \Symfony\Component\Routing\Route|null | |
| * The generated route, if available. | |
| */ | |
| protected function getDeleteFormRoute(EntityTypeInterface $entity_type) { | |
| if ($entity_type->hasLinkTemplate('delete-form')) { | |
| $entity_type_id = $entity_type->id(); | |
| $route = new Route($entity_type->getLinkTemplate('delete-form')); | |
| $route | |
| ->addDefaults([ | |
| '_entity_form' => "{$entity_type_id}.delete", | |
| '_title_callback' => '\Drupal\Core\Entity\Controller\EntityController::deleteTitle', | |
| ]) | |
| ->setRequirement('_entity_access', "{$entity_type_id}.delete") | |
| ->setOption('parameters', [ | |
| $entity_type_id => ['type' => 'entity:' . $entity_type_id], | |
| ]); | |
| // Entity types with serial IDs can specify this in their route | |
| // requirements, improving the matching process. | |
| if ($this->getEntityTypeIdKeyType($entity_type) === 'integer') { | |
| $route->setRequirement($entity_type_id, '\d+'); | |
| } | |
| return $route; | |
| } | |
| } | |
| /** | |
| * Gets the type of the ID key for a given entity type. | |
| * | |
| * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type | |
| * An entity type. | |
| * | |
| * @return string|null | |
| * The type of the ID key for a given entity type, or NULL if the entity | |
| * type does not support fields. | |
| */ | |
| protected function getEntityTypeIdKeyType(EntityTypeInterface $entity_type) { | |
| if (!$entity_type->isSubclassOf(FieldableEntityInterface::class)) { | |
| return NULL; | |
| } | |
| $field_storage_definitions = $this->entityManager->getFieldStorageDefinitions($entity_type->id()); | |
| return $field_storage_definitions[$entity_type->getKey('id')]->getType(); | |
| } | |
| } |