Parlons de votre projet
Partitech Sonata Extra Bundle

Sonata Extra Bundle : déclarer un admin avec l’attribut AsAdmin

Déclarer un service admin avec #[AsAdmin] Les attributs PHP permettent de remplacer une longue déclaration dans services.yaml par une configuration placée directement sur la classe admin. La déclaration classique ressemblait à ceci : app.admin.article: ...

Déclarer un service admin avec #[AsAdmin]

Les attributs PHP permettent de remplacer une longue déclaration dans services.yaml par une configuration placée directement sur la classe admin.

La déclaration classique ressemblait à ceci :

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]]

Avec l’autoconfiguration, le tableau arguments n’est plus nécessaire.

Voici une configuration de base avec #[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;
    }
    
    // ...
}

Si vous avez besoin de services supplémentaires dans votre classe Admin, utilisez l’attribut de méthode #[Required] pour activer l’autowiring, ou définissez des appels dans l'attribut AsAdmin().

Les classes admin doivent également être chargées comme services dans votre configuration YAML.

  • en chargeant le répertoire applicatif :
services:
    _defaults:
        autowire: true
        autoconfigure: true

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

Votre répertoire src/Admin/ ne doit pas être exclu.

  • déclaration de service en une ligne :

    App\SecondAdminDirectory\MyGreatAdmin: ~
    

Si vous utilisez une déclaration automatique sophistiquée basée sur l'Instance comme ceci, cela ne fonctionnera pas :

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

Exemple visuel

Déclaration d’un admin avec l’attribut AsAdmin

L’attribut rapproche la déclaration de la classe concernée. Gardez néanmoins la configuration métier dans l’admin et vérifiez la découverte du service avec bin/console debug:container --tag=sonata.admin.

Partager cet article