# Entity Manager

The entity manager of Muprh is a proxy of the Doctrine's entity manager. It gives you an easy way to create, update and delete an entity and dispatches events easy to subscribe to.

## Implementation

Entities must implements `App\Core\Entity\EntityInterface`.

```php-inline title="src/Entity/MyEntity.php"
namespace App\Entity;

use App\Repository\MyEntityRepository;
use Doctrine\ORM\Mapping as ORM;
use App\Core\Entity\EntityInterface;

#[ORM\Entity(repositoryClass: MyEntityRepository::class)]
class MyEntity implements EntityInterface
{
    // ...
}
```

## Usage

There are 2 entity managers which are services:

* `App\Core\Manager\EntityManager` used for all entities
* `App\Core\Manager\TranslatableEntityManager` used for translatable entities

```php-inline title="src/Controller/FooController.php"
namespace App\Controller;

use App\Core\Manager\EntityManager
use App\Entity\MyEntity;
use Symfony\Component\HttpFoundation\Response;

class FooController
{
    public function foo(EntityManager $entityManager): Response
    {
        $myEntity = new MyEntity();

        // Creates an entity
        $entityManager->create($myEntity);

        // Updates an entity
        $entityManager->update($myEntity);

        // Deletes an entity
        $entityManager->delete($myEntity);

        // ...
    }
}
```

## Events

Events are dispatched before and after creation, update and deletion. All entities of Muprh use the entity manager.

```php-inline title="src/EventSubscriber/MyEntityEventSubscriber.php"
namespace App\EventSubscriber;

use App\Core\Entity\EntityInterface;
use App\Core\Event\EntityManager\EntityManagerEvent;
use App\Core\EventSubscriber\EntityManagerEventSubscriber;
use App\Entity\MyEntity;

class MyEntityEventSubscriber extends EntityManagerEventSubscriber
{
    public function supports(EntityInterface $entity): bool
    {
        return $entity instanceof MyEntity;
    }

    public function onCreate(EntityManagerEvent $event)
    {
        if (!$this->supports($event->getEntity())) {
            return;
        }

        // ...
    }

    public function onUpdate(EntityManagerEvent $event)
    {
        if (!$this->supports($event->getEntity())) {
            return;
        }

        // ...
    }

    public function onDelete(EntityManagerEvent $event)
    {
        if (!$this->supports($event->getEntity())) {
            return;
        }

        // ...
    }

    public function onPreCreate(EntityManagerEvent $event)
    {
        if (!$this->supports($event->getEntity())) {
            return;
        }

        // ...
    }

    public function onPreUpdate(EntityManagerEvent $event)
    {
        if (!$this->supports($event->getEntity())) {
            return;
        }

        // ...
    }

    public function onPreDelete(EntityManagerEvent $event)
    {
        if (!$this->supports($event->getEntity())) {
            return;
        }

        // ...
    }
}
```
