diff --git a/cookbook/map.rst.inc b/cookbook/map.rst.inc index 4762a2d41fa..805eee4a262 100644 --- a/cookbook/map.rst.inc +++ b/cookbook/map.rst.inc @@ -150,6 +150,7 @@ * :doc:`/cookbook/routing/custom_route_loader` * :doc:`/cookbook/routing/redirect_trailing_slash` * :doc:`/cookbook/routing/extra_information` + * :doc:`/cookbook/routing/routing_from_database` * :doc:`Security Authentication (Identifying/Logging in the User) ` diff --git a/cookbook/routing/index.rst b/cookbook/routing/index.rst index c42cff1748d..28b3fe97570 100644 --- a/cookbook/routing/index.rst +++ b/cookbook/routing/index.rst @@ -12,3 +12,4 @@ Routing custom_route_loader redirect_trailing_slash extra_information + routing_from_database diff --git a/cookbook/routing/routing_from_database.rst b/cookbook/routing/routing_from_database.rst new file mode 100644 index 00000000000..c63094ce944 --- /dev/null +++ b/cookbook/routing/routing_from_database.rst @@ -0,0 +1,41 @@ +.. index:: + single: Routing; Extra Information + +Looking up Routes from a Database: Symfony CMF DynamicRouter +============================================================ + +The core Symfony Routing System is excellent at handling complex sets +of routes. A highly optimized routing cache is dumped during +deployments. + +However, when working with large amounts of data that each need a nice +readable URL (e.g. for search engine optimization purposes), the routing +can get slowed down. Additionally, if routes need to be edited by users, +the route cache would need to be rebuilt frequently. + +For these cases, the ``DynamicRouter`` offers an alternative approach: + +* Routes are stored in a database; +* There is a database index on the path field, the lookup scales to huge + numbers of different routes; +* Writes only affect the index of the database, which is very efficient. + +When all routes are known during deploy time and the number is not too +high, using a :doc:`custom route loader ` is the +preferred way to add more routes. When working with just one type of +objects, a slug parameter on the object and the ``@ParamConverter`` +annotation work fine (see FrameworkExtraBundle_) . + +The ``DynamicRouter`` is useful when you need ``Route`` objects with +the full feature set of Symfony. Each route can define a specific +controller so you can decouple the URL structure from your application +logic. + +The DynamicRouter comes with built-in support for Doctrine ORM and Doctrine +PHPCR-ODM but offers the ``ContentRepositoryInterface`` to write a custom +loader, e.g. for another database type or a REST API or anything else. + +The DynamicRouter is explained in the `Symfony CMF documentation`_. + +.. _FrameworkExtraBundle: https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html +.. _`Symfony CMF documentation`: http://symfony.com/doc/master/cmf/book/routing.html