sajad torkamani

You have two ways of defining callbacks for your Doctrine entities.

1. Define callback in the entity class

If your callback doesn’t require any other services and only applies to a single entity, you can define it directly in the entity class:

#[ORM\Entity(repositoryClass: UserRepository::class)]
#[ORM\HasLifecycleCallbacks]
class User
{
  // All the other properties and methods...

  #[ORM\PrePersist]
  public function setCreatedAtValue()
  {
    $this->createdAt = new \DateTimeImmutable();
  }
}

2. Create a Doctrine entity listener

For more complex listeners where you need to use other services, you can create a dedicated listener class (e.g., src/EntityListener/ConferenceEntityListener.php):

<?php

namespace App\EntityListener;

use App\Entity\Conference;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Symfony\Component\String\Slugger\SluggerInterface;

class ConferenceEntityListener
{
    private SluggerInterface $slugger;

    public function __construct(SluggerInterface $slugger)
    {
        $this->slugger = $slugger;
    }

    public function prePersist(Conference $conference, LifecycleEventArgs $event)
    {
        $conference->computeSlug($this->slugger);
    }

    public function preUpdate(Conference $conference, LifecycleEventArgs $event)
    {
        $conference->computeSlug($this->slugger);
    }
}

You’ll then need to register the entity listener with the Doctrine event dispatcher by adding the following to config/services.yaml:

# add more service definitions when explicit configuration is needed
# please note that last definitions always *replace* previous on  
App\EntityListener\ConferenceEntityListener:
  tags:
    - { name: 'doctrine.orm.entity_listener', event: 'prePersist', entity: 'App\Entity\Conference' }
    - { name: 'doctrine.orm.entity_listener', event: 'preUpdate', entity: 'App\Entity\Conference' }

Sources