Salt la conținut

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

AtributEfect
#[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'