Advanced configuration ====================== Service Configuration --------------------- When you create a new Admin service you can configure its dependencies, the services which are injected by default are: ========================= ============================================= Dependencies Service Id ========================= ============================================= model_manager sonata.admin.manager.%manager-type% form_contractor sonata.admin.builder.%manager-type%_form show_builder sonata.admin.builder.%manager-type%_show list_builder sonata.admin.builder.%manager-type%_list datagrid_builder sonata.admin.builder.%manager-type%_datagrid translator translator configuration_pool sonata.admin.pool router router validator validator security_handler sonata.admin.security.handler menu_factory knp_menu.factory route_builder sonata.admin.route.path_info | sonata.admin.route.path_info_slashes label_translator_strategy sonata.admin.label.strategy.form_component ========================= ============================================= Note: %manager-type% is to be replaced by the manager type (orm, doctrine_mongodb...), and the default route_builder depends on it. You have 2 ways of defining the dependencies inside ``services.xml``: * With a tag attribute, less verbose: .. configuration-block:: .. code-block:: xml Acme\ProjectBundle\Entity\Project .. configuration-block:: .. code-block:: yaml acme.project.admin.project: class: Acme\ProjectBundle\Admin\ProjectAdmin tags: - name: sonata.admin manager_type: orm group: "Project" label: "Project" label_translator_strategy: "sonata.admin.label.strategy.native" route_builder: "sonata.admin.route.path_info" arguments: - ~ - Acme\ProjectBundle\Entity\Project - ~ * With a method call, more verbose .. configuration-block:: .. code-block:: xml Acme\ProjectBundle\Entity\Project .. configuration-block:: .. code-block:: yaml acme.project.admin.project: class: Acme\ProjectBundle\Admin\ProjectAdmin tags: - { name: sonata.admin, manager_type: orm, group: "Project", label: "Project" } arguments: - ~ - Acme\ProjectBundle\Entity\Project - ~ calls: - [ setLabelTranslatorStrategy, [ @sonata.admin.label.strategy.native ]] - [ setRouteBuilder, [ @sonata.admin.route.path_info ]] If you want to modify the service that is going to be injected, add the following code to your application's config file: .. configuration-block:: .. code-block:: yaml # app/config/config.yml admins: sonata_admin: sonata.order.admin.order: # id of the admin service this setting is for model_manager: # dependency name, from the table above sonata.order.admin.order.manager # customised service id Creating a custom RouteBuilder ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ To create your own RouteBuilder create the PHP class and register it as a service: * php Route Generator .. code-block:: php add('yourSubAction'); // Create button will disappear, delete functionality will be disabled as well // No more changes needed! $collection->remove('create'); $collection->remove('delete'); } } * xml service registration .. configuration-block:: .. code-block:: xml * YAML service registration .. configuration-block:: .. code-block:: yaml parameters: acme.admin.entity_route_builder.class: Acme\AdminBundle\Route\EntityRouterBuilder services: acme.admin.entity_route_builder: class: %acme.admin.entity_route_builder.class% arguments: - @sonata.admin.audit.manager Inherited classes ----------------- You can manage inherited classes by injecting subclasses using the service configuration. Lets consider a base class named `Person` and its subclasses `Student` and `Teacher`: .. configuration-block:: .. code-block:: xml YourNS\AdminBundle\Entity\Person YourNS\AdminBundle\Entity\Student YourNS\AdminBundle\Entity\Teacher You will just need to change the way forms are configured in order to take into account this new subclasses: .. code-block:: php getSubject(); $form->add('name'); if ($subject instanceof Teacher) { $form->add('course', 'text'); } elseif ($subject instanceof Student) { $form->add('year', 'integer'); } }