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

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.