Discuss your project
Partitech Sonata Extra Bundle

Sonata Extra Bundle: declare an admin with the AsAdmin attribute

Declare an admin service with #[AsAdmin] PHP attributes allow replacing a long declaration in services.yaml by a configuration placed directly on the admin class. The classic statement looked like this: app.admin.article: class: App\Admin\MyEntityAdm...

Declare an admin service with #[AsAdmin]

PHP attributes allow replacing a long declaration in services.yaml by a configuration placed directly on the admin class.

The classic statement looked like this:

app.admin.article:
       class: App\Admin\MyEntityAdmin
       arguments: [~, App\Entity\MyEntity, ~]
       tags:
           - { name: sonata.admin, manager_type: orm, label: "My Entity Admin" }
       calls:
           - [ setTranslationDomain, [partitech]]

With auto-configuration, the table arguments is no longer necessary.

Here is a basic configuration with #[AsAdmin] :


use Partitech\SonataExtra\Attribute\AsAdmin;
use Symfony\Contracts\Service\Attribute\Required;

#[AsAdmin(
    manager_type: 'orm',
    group: 'Admin',
    label: 'My Entity Admin',
    model_class: \Partitech\SonataExtra\Entity\MyEntity::class,
    controller: \Partitech\SonataExtra\Controller\Admin\MyEntityController::class,
    calls: [
        ['setTranslationDomain', ['partitech']],
        ['setMyAttributeCallService'],
    ]
)]
class MyEntityAdmin extends AbstractAdmin
{
    private MyRequiredService $myRequiredService;
    private MyAttributeCallService $myAttributeCallService;
    
    #[Required]
    public function setMyRequiredService(MyRequiredService $myRequiredService): void
    {
        $this->myRequiredService = $myRequiredService;
    }

    public function setMyAttributeCallService(MyAttributeCallService $myAttributeCallService): void
    {
        $this->myAttributeCallService = $myAttributeCallService;
    }
    
    // ...
}

If you need additional services in your Admin class, use the method attribute #[Required] to activate autowiring, or set calls in the AsAdmin() attribute.

Admin classes must also be loaded as services in your YAML configuration.

  • by loading the application directory:
services:
    _defaults:
        autowire: true
        autoconfigure: true

    App\:
        resource: '../src/'
        exclude:
            - '../src/DependencyInjection/'
            - '../src/Entity/'
            - '../src/Kernel.php'

Your src/Admin/ directory must not be excluded.

  • one-line service statement:

    App\SecondAdminDirectory\MyGreatAdmin: ~
    

If you use a sophisticated automatic declaration based on the Instance like this, it will not work:

services:
  _defaults:
    autowire: true
    autoconfigure: true
  _instanceof:
    Sonata\AdminBundle\Admin\AbstractAdmin:
      tags: { name: sonata.admin }

Visual example

Declaration of an admin with the AsAdmin attribute

The attribute brings the declaration of the concerned class closer. Nevertheless, keep the business configuration in the admin and check the service discovery with bin/console debug:container --tag=sonata.admin.

Share this article