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
| Hook | Câ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()sauUser::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.