Evenimente
Sistemul de evenimente din Leto este bazat pe un fork al WordPress Hooks API. Oferă atât hook-uri procedurale (add_action / do_action) cât și înregistrare automată prin atribute.
Managerul de hook-uri
Clasa Leto\Events\Manager este un singleton care gestionează acțiuni și filtre.
use Leto\Events\Manager;
$manager = Manager::getInstance();
// Înregistrează o acțiune
$manager->add_action('user.created', function ($user) {
echo "Utilizator creat: " . $user->name;
}, priority: 10);
// Execută toate acțiunile înregistrate pentru un tag
$manager->do_action('user.created', $user);Metode principale
| Metodă | Descriere |
|---|---|
add_action($tag, $callback, $priority) | Înregistrează un handler pentru o acțiune |
do_action($tag, $arg) | Execută toate acțiunile înregistrate |
remove_action($tag, $callback, $priority) | Elimină un handler |
remove_all_actions($tag) | Elimină toate handler-urile |
add_filter($tag, $callback, $priority) | Înregistrează un filtru (modifică și returnează valoarea) |
apply_filters($tag, $value) | Aplică toate filtrele înregistrate |
Prioritatea implicită este 50. Numerele mai mici se execută primele.
Parametri tipizați cu Struct
Recomandare: Pentru pasarea parametrilor și rezultatelor între handleri, folosește
Struct în loc de array-uri simple. Un Struct oferă autocompletare în IDE, tipizare și serializare automată. Vezi Struct.use Leto\Data\Struct;
// Definește un Struct pentru datele evenimentului
class UserCreatedEvent extends Struct
{
public int $user_id;
public string $email;
public string $role;
}
// Emite evenimentul cu un Struct
$event = new UserCreatedEvent();
$event->user_id = $user->id;
$event->email = $user->email;
$event->role = 'member';
Manager::getInstance()->do_action('user_created', [$event]);Handlerul primește array $args — primul element e Struct-ul:
public static function user_created(array $args): void
{
$event = $args[0]; // UserCreatedEvent
if ($event->role === 'admin') {
// ...
}
}EventHandler cu atribute
Clasa Leto\Events\EventHandler oferă înregistrare automată: metodele publice statice devin handleri, iar numele metodei este tag-ul evenimentului.
use Leto\Events\Attributes\Failable;
use Leto\Events\Attributes\Priority;
use Leto\Events\EventHandler;
class UserEvents extends EventHandler
{
#[Priority(5)]
public static function user_created(array $args): void
{
$user = $args[0];
// Trimite email de bun venit
}
#[Priority(20)]
#[Failable]
public static function user_logged_in(array $args): void
{
$user = $args[0];
// Logare activitate — nu blochează dacă eșuează
}
}
// Înregistrează toate metodele ca handleri
UserEvents::register();Atribute disponibile
| Atribut | Efect |
|---|---|
#[Priority(n)] | Setează prioritatea (implicit 10, mai mic = executat mai devreme) |
#[Failable] | Handlerul nu oprește execuția dacă aruncă excepție — eroarea e logată |
Execuție
$user = new User();
// ...
Manager::getInstance()->do_action('user_created', [$user]);Filtre
Filtrele modifică și returnează o valoare, spre deosebire de acțiuni care doar se execută:
$manager = Manager::getInstance();
$manager->add_filter('page_title', function ($title) {
return strtoupper($title);
});
$title = $manager->apply_filters('page_title', 'bun venit');
// $title = 'BUN VENIT'