Cover of the book Symfony 5: The Fast Track

Symfony 5: The Fast Track is the best book to learn modern Symfony development, from zero to production. +300 pages showcasing Symfony with Docker, APIs, queues & async tasks, Webpack, SPAs, etc.

WARNING: You are browsing the documentation for version 2.x which is not maintained anymore. If some of your projects are still using this version, consider upgrading.

24. Extensions

2.x version
Maintained Unmaintained
2.x

24. Extensions

Admin extensions allow you to add or change features of one or more Admin instances. To create an extension your class must implement the interface Sonata\AdminBundle\Admin\AdminExtensionInterface and be registered as a service. The interface defines a number of functions which you can use to customize the edit form, list view, form validation, alter newly created objects and other admin features.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
use Sonata\AdminBundle\Admin\AdminExtension;
use Sonata\AdminBundle\Form\FormMapper;

class PublishStatusAdminExtension extends AdminExtension
{
    public function configureFormFields(FormMapper $formMapper)
    {
        $formMapper->add('status', 'choice', array(
            'choices' => array(
                'draft' => 'Draft',
                'published' => 'Published',
            ),
        ));
    }
}

24.1. Configuration

There are two ways to configure your extensions and connect them to an admin.

You can include this information in the service definition of your extension. Add the tag sonata.admin.extension and use the target attribute to point to the admin you want to modify. Please note you can specify as many tags you want. Set the global attribute to true and the extension will be added to all admins.

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    services:
        acme.demo.publish.extension:
            class: Acme\Demo\BlogBundle\Admin\Extension\PublishStatusAdminExtension
            tags:
                - { name: sonata.admin.extension, target: acme.demo.admin.article }
                - { name: sonata.admin.extension, target: acme.demo.admin.blog }
    
        acme.demo.order.extension:
            class: Acme\Demo\BlogBundle\Admin\Extension\OrderAdminExtension
            tags:
                - { name: sonata.admin.extension, global: true }
    

The second option is to add it to your config.yml file.

  • YAML
    1
    2
    3
    4
    5
    6
    # app/config/config.yml
        sonata_admin:
            extensions:
                acme.demo.publish.extension:
                    admins:
                        - acme.demo.admin.article
    

Using the config.yml file has some advantages, it allows you to keep your configuration centralized and it provides some extra options you can use to wire your extensions in a more dynamic way. This means you can change the behaviour of all admins that manage a class of a specific type.

admins:
specify one or more admin service ids to which the Extension should be added
excludes:
specify one or more admin service ids to which the Extension should not be added (this will prevent it matching any of the other settings)
extends:
specify one or more classes. If the managed class of an admin extends one of the specified classes the extension will be added to that admin.
implements:
specify one or more interfaces. If the managed class of an admin implements one of the specified interfaces the extension will be added to that admin.
instanceof:
specify one or more classes. If the managed class of an admin extends one of the specified classes or is an instance of that class the extension will be added to that admin.
  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    # app/config/config.yml
        sonata_admin:
            extensions:
                acme.demo.publish.extension:
                    admins:
                        - acme.demo.admin.article
                    implements:
                        - Acme\Demo\Publish\PublishStatusInterface
                    excludes:
                        - acme.demo.admin.blog
                        - acme.demo.admin.news
                    extends:
                        - Acme\Demo\Document\Blog
                    instanceof:
                        -  Acme\Demo\Document\Page
    

This work, including the code samples, is licensed under a Creative Commons BY-SA 3.0 license.