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

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.