Change record status: 
Project: 
Introduced in branch: 
8.0.x
Introduced in version: 
8.0.0-RC2
Description: 

Writing an entity type can be a lot of work, especially when it comes down to deal with routing.
#2578955: Implement auto route generation but DON'T use it for all core entities added a couple of things to make the life easier:

A html route provider

See \Drupal\Core\Entity\Routing\DefaultHtmlRouteProvider

Before

# In the .routing.yml file
entity.aggregator_feed.canonical:
  path: '/aggregator/sources/{aggregator_feed}'
  defaults:
    _entity_view: 'aggregator_feed'
    _title_callback: '\Drupal\aggregator\Controller\AggregatorController::feedTitle'
  requirements:
    _permission: 'access news feeds'

entity.aggregator_feed.edit_form:
  path: '/aggregator/sources/{aggregator_feed}/configure'
  defaults:
    _entity_form: 'aggregator_feed.default'
    _title: 'Configure'
  requirements:
    _permission: 'administer news feeds'
  options:
    _admin_route: TRUE

entity.aggregator_feed.delete_form:
  path: '/aggregator/sources/{aggregator_feed}/delete'
  defaults:
    _entity_form: 'aggregator_feed.delete'
    _title: 'Delete feed'
  requirements:
    _permission: 'administer news feeds'
  options:
    _admin_route: TRUE

After

# In the entity annotation

 * @ContentEntityType(
 *   id = "aggregator_feed",
 *   label = @Translation("Aggregator feed"),
 *   handlers = {
 *     "route_provider" = {
 *       "html" = "Drupal\aggregator\FeedHtmlRouteProvider",
 *     },
 *   },

This will automatically generate the routes

Generic title callbacks

Even if you don't use the route providers you can still save a little bit of code:

Before

entity.aggregator_feed.canonical:
  path: '/aggregator/sources/{aggregator_feed}'
  defaults:
    _entity_view: 'aggregator_feed'
    _title_callback: '\Drupal\aggregator\Controller\AggregatorController::feedTitle'

entity.aggregator_feed.edit_form:
  path: '/aggregator/sources/{aggregator_feed}/configure'
  defaults:
    _entity_form: 'aggregator_feed.default'
    _title: 'Configure'

entity.aggregator_feed.delete_form:
  path: '/aggregator/sources/{aggregator_feed}/delete'
  defaults:
    _title: 'Delete feed'

After

entity.aggregator_feed.canonical:
  path: '/aggregator/sources/{aggregator_feed}'
  defaults:
    _entity_view: 'aggregator_feed'
    _title_callback: '\Drupal\Core\Entity\Controller\EntityController::title'

entity.aggregator_feed.edit_form:
  path: '/aggregator/sources/{aggregator_feed}/configure'
  defaults:
    _entity_form: 'aggregator_feed.default'
    _title_callback: '\Drupal\Core\Entity\Controller\EntityController::editTitle'

entity.aggregator_feed.delete_form:
  path: '/aggregator/sources/{aggregator_feed}/delete'
  defaults:
    _title_callback: '\Drupal\Core\Entity\Controller\EntityController::deleteTitle'
Impacts: 
Module developers

Comments

kristiaanvandeneynde’s picture

In case anyone was wondering: Currently, FeedHtmlRouteProvider extends AdminHtmlRouteProvider which in turn extends DefaultHtmlRouteProvider. The example above doesn't really mention this, but DefaultHtmlRouteProvider is indeed being used here.