<?php
namespace App\EventSubscriber\Admin;
use App\Entity\BlogPost;
use App\Service\BlogPostScopeResolver;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeCrudActionEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityPersistedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityUpdatedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class BlogPostScopeSubscriber implements EventSubscriberInterface
{
public function __construct(
private BlogPostScopeResolver $blogPostScopeResolver,
) {
}
public static function getSubscribedEvents(): array
{
return [
BeforeCrudActionEvent::class => 'onBeforeCrudAction',
BeforeEntityPersistedEvent::class => 'onBeforePersist',
BeforeEntityUpdatedEvent::class => 'onBeforeUpdate',
];
}
public function onBeforeCrudAction(BeforeCrudActionEvent $event): void
{
$context = $event->getAdminContext();
if (null === $context) {
return;
}
if (!$context->getRequest()->isMethod('GET')) {
return;
}
if (Crud::PAGE_EDIT !== $context->getCrud()?->getCurrentAction()) {
return;
}
$entity = $context->getEntity()?->getInstance();
if (!$entity instanceof BlogPost) {
return;
}
// Edit form bootstrap: hydrate in-memory only, no flush here.
$this->blogPostScopeResolver->hydrateFromRubrique($entity, false);
}
public function onBeforePersist(BeforeEntityPersistedEvent $event): void
{
$entity = $event->getEntityInstance();
if (!$entity instanceof BlogPost) {
return;
}
$this->blogPostScopeResolver->hydrateFromRubrique($entity, false);
}
public function onBeforeUpdate(BeforeEntityUpdatedEvent $event): void
{
$entity = $event->getEntityInstance();
if (!$entity instanceof BlogPost) {
return;
}
$this->blogPostScopeResolver->hydrateFromRubrique($entity, true);
}
}