Declarar un servicio admin con #[AsAdmin]
Los atributos de PHP permiten reemplazar una larga declaración en services.yaml mediante una configuración colocada directamente en la clase admin.
La declaración clásica se parecía a esto:
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 la autoconfiguración, el tablero arguments ya no es necesario.
Aquí hay una configuración básica 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;
}
// ...
}
Si necesita servicios adicionales en su clase Admin, use el atributo de método #[Required] para activar el autowiring, o defina llamadas en el atributo AsAdmin().
Las clases de administración también deben cargarse como servicios en su configuración YAML.
- cargando el directorio de la aplicación :
services:
_defaults:
autowire: true
autoconfigure: true
App\:
resource: '../src/'
exclude:
- '../src/DependencyInjection/'
- '../src/Entity/'
- '../src/Kernel.php'
Su directorio src/Admin/ no debe ser excluido.
-
declaración de servicio en una línea:
App\SecondAdminDirectory\MyGreatAdmin: ~
Si utiliza una declaración automática sofisticada basada en la Instancia así, esto no funcionará:
services:
_defaults:
autowire: true
autoconfigure: true
_instanceof:
Sonata\AdminBundle\Admin\AbstractAdmin:
tags: { name: sonata.admin }
Ejemplo visual

El atributo acerca la declaración de la clase correspondiente. Sin embargo, mantenga la configuración de negocio en el administrador y verifique el descubrimiento del servicio con bin/console debug:container --tag=sonata.admin.