Salt la conținut

Hook-uri de salvare

Hook-uri de salvare (Lifecycle Hooks)

ORM-ul Leto oferă hook-uri de ciclu de viață prin trait-ul SaveHookCapability, deja inclus în clasa Model. Poți suprascrie aceste metode în modelul tău pentru a executa logică înainte sau după operațiunile CRUD.

Hook-uri disponibile

HookCând se execută
beforeCreate()Înainte de INSERT
afterCreate()După INSERT (ID-ul e deja populat)
beforeUpdate()Înainte de UPDATE (doar mod single-entity)
afterUpdate()După UPDATE (doar mod single-entity)
beforeDelete()Înainte de DELETE (doar mod single-entity)
afterDelete()După DELETE (doar mod single-entity)
Hook-urile de update și delete se execută doar în modul single-entity (când modifici o instanță de model, nu în bulk).

Utilizare

Suprascrie metodele direct în modelul tău:

#[Table('users')]
class User extends Model
{
    #[PrimaryKey, AutoIncrement]
    public int $id;

    #[Varchar(100)]
    public string $name;

    #[DateTime]
    public \DateTimeImmutable $created_at;

    #[DateTime]
    public ?\DateTimeImmutable $updated_at = null;

    protected function beforeCreate(): void
    {
        // Setează automat data creării
        $this->created_at = new \DateTimeImmutable();
    }

    protected function beforeUpdate(): void
    {
        // Setează automat data modificării
        $this->updated_at = new \DateTimeImmutable();
    }

    protected function afterCreate(): void
    {
        // Trimite notificare după creare
        NotificationService::sendWelcomeEmail($this);
    }

    protected function beforeDelete(): void
    {
        // Validează că utilizatorul poate fi șters
        if ($this->role === 'admin') {
            throw new \Exception('Nu poți șterge un admin!');
        }
    }
}

Ordinea de execuție

create():
  beforeCreate() → INSERT → afterCreate()

update() (single-entity):
  beforeUpdate() → UPDATE → afterUpdate()

delete() (single-entity):
  beforeDelete() → DELETE → afterDelete()

Limitări

  • Hook-urile nu se execută în operațiunile bulk (când folosești User::where(...)->update() sau User::where(...)->delete()). În aceste cazuri, logica trebuie gestionată manual.
  • Hook-urile sunt metode protected — implementarea implicită este goală (corpul metodei e {}), deci nu ești obligat să le suprascrii pe toate.