RouteBundle =========== The RouteBundle provides the feature of managing website-routes for custom-entities. These routes will be generated by calling the `RouteManager` which uses a configurable schema for creating the route-path. Every Entity can be combined with a route. You only have to call the `create` method of the service `sulu_route.manager.route_manager` with an entity implementing the `RoutableInterface`. The `update` method will update the route-path with the configured schema and hold "history" (301 redirects) routes for the old routes. To resolve the route on request you have to provide a `RouteDefaultsProvider` which defines the controller and attributes of the route. Further Topics -------------- .. toctree:: :maxdepth: 1 custom_route_generator Example ------- This example will create a simple example-entity which will be available on the website with an own route. Entity ****** First extend your entity with the propertie's `id`, `locale` and a new many-to-one relation `route`: reciepe.orm.xml: .. code-block:: xml ... Reciepe.php: .. code-block:: php namespace AppBundle\Entity; use Sulu\Bundle\RouteBundle\Model\RoutableInterface; use Sulu\Bundle\RouteBundle\Model\RouteInterface; class Recipe implements RoutableInterface { /** * @var string */ private $title; /** * @var RouteInterface */ private $route; public function getTitle() { ... } public function setTitle() { ... } /** * {@inheritdoc} */ public function getId() { ... } /** * {@inheritdoc} */ public function getLocale() { ... } /** * {@inheritdoc} */ public function setRoute(RouteInterface $route) { ... } /** * {@inheritdoc} */ public function getRoute() { ... } } Route-Schema ************ Configure the route-schema in the file `app/config/config.yml`: .. code-block:: yaml sulu_route: mappings: AppBundle\Entity\Recipe: generator: schema options: route_schema: /{translator.trans('recipe')}/{object.getTitle()} .. note:: You can use the `translator` in the schema to create translated routes. RecipeController **************** .. code-block:: php namespace AppBundle\Controller; use AppBundle\Entity\Recipe; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class RecipeController extends Controller { public function indexAction(Recipe $recipe) { return $this->render('AppBundle:website:recipe.html.twig', ['recipe' => $recipe]); } } RouteDefaultsProvider ********************* .. code-block:: php namespace AppBundle\Routing; use AppBundle\Entity\Recipe; use AppBundle\Entity\RecipeRepository; use Sulu\Bundle\RouteBundle\Routing\Defaults\RouteDefaultsProviderInterface; class RecipeRouteDefaultProvider implements RouteDefaultsProviderInterface { protected $recipeRepository; public function __construct(RecipeRepository $recipeRepository) { $this->recipeRepository = $recipeRepository; } public function getByEntity($entityClass, $id, $locale, $object = null) { return [ '_controller' => 'AppBundle:Recipe:index', 'recipe' => $object ?: $this->recipeRepository->find($id, $locale), ]; } public function isPublished($entityClass, $id, $locale) { return true; } public function supports($entityClass) { return $entityClass === Recipe::class; } } Register this class as a service with the tag ``. After that the entity is ready to get a route. To create a route for the new entities simple call the `save` method of the service `sulu_route.manager.route_manager`. .. note:: To update already existing entities you can run the command `bin/console sulu:route:update AppBundle:Recipe` which updates or creates the route for all the entities of this type.