Dichiarare un servizio admin con #[AsAdmin]
Gli attributi PHP permettono di sostituire una lunga dichiarazione in services.yaml tramite una configurazione posta direttamente sulla classe admin.
La dichiarazione classica era simile a questa:
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]]
Con l'autoconfigurazione, il quadro arguments non è più necessario.
Ecco una configurazione di base con #[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;
}
// ...
}
Se avete bisogno di servizi aggiuntivi nella vostra classe Admin, utilizzate l'attributo del metodo #[Required] per attivare l’autowiring, o definire delle chiamate nell'attributo AsAdmin().
Le classi admin devono essere caricate anche come servizi nella vostra configurazione YAML.
- caricando la directory dell'applicazione:
services:
_defaults:
autowire: true
autoconfigure: true
App\:
resource: '../src/'
exclude:
- '../src/DependencyInjection/'
- '../src/Entity/'
- '../src/Kernel.php'
La vostra directory src/Admin/ non deve essere esclusa.
-
dichiarazione di servizio in una riga:
App\SecondAdminDirectory\MyGreatAdmin: ~
Se utilizzate una dichiarazione automatica sofisticata basata sull'Istanza come questa, non funzionerà:
services:
_defaults:
autowire: true
autoconfigure: true
_instanceof:
Sonata\AdminBundle\Admin\AbstractAdmin:
tags: { name: sonata.admin }
Esempio visivo

L'attribut avvicina la dichiarazione della classe interessata. Tuttavia, mantenete la configurazione aziendale nell'admin e verificate la scoperta del servizio con bin/console debug:container --tag=sonata.admin.