@harrasteblogi JUURI NYT
--:--

Tilaa uutiskirje

Saat tuoreimmat 10 uusinta artikkelia kerran viikossa sähköpostiisi.

Tilaa uutiskirje

WordPressin event-driven arkkitehtuuri plugin-kehityksessäWordPress perustuu jo valmiiksi tapahtumapohjaiseen arkkitehtuuriin. Actionit ja filterit ovat käytännössä event-driven programmingia, vaikka moni WordPress-kehittäjä käyttää niitä vain yksittäisten hookien lisäämiseen.

Tiivistelmä
Mitä event-driven arkkitehtuuri tarkoittaa

Perinteinen procedural-malli:...

WordPress on jo event-driven

WordPress käyttää:...

Miksi tämä on tärkeää plugin-kehityksessä

Ilman event-ajattelua pluginit muuttuvat nopeasti:...

Domain events WordPressissä

Hyvä käytäntö on luoda omia domain-tapahtumia....

Event dispatcher -kerros

Voit rakentaa oman dispatcher-luokan:...

Event naming strategy

Hyvä nimeäminen:...

Payload-rakenne

Älä lähetä satunnaisia parametreja....

Async event processing

Yksi suurimmista eduista....

Event-driven + background processing

Erinomainen yhdistelmä:...

Pluginien välinen integraatio

Eventit tekevät integraatioista siistejä....

Event abstraction layer

Suurissa projekteissa kannattaa erottaa:...

Observer pattern WordPressissä

WordPress hookit toimivat käytännössä observer patternilla:...

Loose coupling

Tärkein hyöty:...

Event-driven cache invalidation

Erittäin hyödyllinen....

Logging eventit

Voit logata kaikki eventit:...

Prioriteetit hookeissa

WordPress listenerit tukevat prioriteetteja:...

Event storming ongelma

Liikaa eventtejä → vaikea seurata järjestelmää....

Yleisimmät virheet

Moderni WordPress plugin:...

Paras arkkitehtuuri

Moderni WordPress plugin:...

Yhteenveto

Event-driven arkkitehtuuri tekee WordPress-pluginien rakenteesta huomattavasti joustavamman ja helpommin laajennettavan. Kun logiikka rakennetaan tapahtumien ympärille eikä suorien riippuvuuksien varaan, järjestelmä pysyy hallittavana myös projektin kasvaessa....

Kun event-driven-ajattelu viedään pidemmälle plugin-kehityksessä, syntyy huomattavasti modulaarisempi, skaalautuvampi ja helpommin ylläpidettävä järjestelmä.

Sen sijaan että kaikki logiikka kutsuisi kaikkea suoraan, järjestelmä reagoi tapahtumiin.

Mitä event-driven arkkitehtuuri tarkoittaa

Perinteinen procedural-malli:

save_order()
 ├── send_email()
 ├── sync_crm()
 ├── generate_invoice()
 └── update_stats()

Kaikki riippuu kaikesta.

Event-driven malli:

Order Created Event
 ├── Email Listener
 ├── CRM Listener
 ├── Invoice Listener
 └── Analytics Listener

Komponentit ovat irrotettu toisistaan.

WordPress on jo event-driven

WordPress käyttää:

  • do_action()
  • add_action()
  • apply_filters()

Esimerkki:

do_action('save_post', $post_id);

Listener:

add_action('save_post', function($post_id) {

});

Tämä on event-driven ohjelmointia.

Miksi tämä on tärkeää plugin-kehityksessä

Ilman event-ajattelua pluginit muuttuvat nopeasti:

  • tiukasti kytketyiksi
  • vaikeasti laajennettaviksi
  • vaikeasti testattaviksi

Event-driven rakenne mahdollistaa:

  • modulaarisuuden
  • async processingin
  • pluginien välisen kommunikoinnin
  • featureiden eriyttämisen

Domain events WordPressissä

Hyvä käytäntö on luoda omia domain-tapahtumia.

Esimerkki:

do_action('myplugin/order_completed', $order_id);

Sen sijaan että kutsuttaisiin kaikkea suoraan.

Listenerit erillisiin luokkiin

Huono:

function process_order() {

    send_email();
    sync_crm();
    update_stats();
}

Parempi:

add_action(
    'myplugin/order_completed',
    [EmailListener::class, 'handle']
);

Event dispatcher -kerros

Voit rakentaa oman dispatcher-luokan:

class EventDispatcher {

    public function dispatch($event, $payload = []) {

        do_action($event, $payload);
    }
}

Event naming strategy

Hyvä nimeäminen:

plugin.resource.action

Esimerkkejä:

myplugin.user.created
myplugin.order.completed
myplugin.cache.invalidated

Payload-rakenne

Älä lähetä satunnaisia parametreja.

Huono:

do_action('event', $id, $email, $status);

Parempi:

do_action('event', [
    'id' => $id,
    'email' => $email,
    'status' => $status
]);

Async event processing

Yksi suurimmista eduista.

Event trigger:

do_action('myplugin/report_requested', $report_id);

Listener lisää työn queueen:

add_action('myplugin/report_requested', function($report_id) {

    queue_job('generate_report', $report_id);
});

Event-driven + background processing

Erinomainen yhdistelmä:

User Registered Event
↓
Queue Job
↓
Worker Process
↓
Email + CRM Sync

Frontend pysyy nopeana.

Pluginien välinen integraatio

Eventit tekevät integraatioista siistejä.

Esimerkki:

do_action('myplugin/subscription_activated', $user_id);

Kolmannen osapuolen plugin voi kuunnella tätä ilman tiukkaa riippuvuutta.

Event abstraction layer

Suurissa projekteissa kannattaa erottaa:

src/Events/
src/Listeners/

Esimerkki:

class OrderCompletedEvent {

    public function __construct(
        public int $order_id
    ) {}
}

Observer pattern WordPressissä

WordPress hookit toimivat käytännössä observer patternilla:

  • subject = event source
  • observers = listeners

Loose coupling

Tärkein hyöty:

Komponentit eivät tiedä toisistaan.

Esimerkki:

  • OrderService ei tiedä EmailServicestä
  • EmailService vain kuuntelee eventtiä

Event-driven cache invalidation

Erittäin hyödyllinen.

do_action('myplugin/product_updated', $product_id);

Listener:

add_action('myplugin/product_updated', function($product_id) {

    cache()->delete("product:$product_id");
});

Logging eventit

Voit logata kaikki eventit:

add_action('all', function($hook) {

});

Tuotannossa tätä kannattaa käyttää varoen.

Prioriteetit hookeissa

WordPress listenerit tukevat prioriteetteja:

add_action('event', 'callback', 20);

Alempi numero = suoritetaan ensin.

Event storming ongelma

Liikaa eventtejä → vaikea seurata järjestelmää.

Huono:

event_everything_happened

Parempi:

  • vain oikeat domain-eventit
  • selkeä naming strategy

Event sourcing? Ei yleensä WordPressiin

Täysi event sourcing:

  • liian raskas useimpiin WP-projekteihin

Mutta kevyt domain-event-ajattelu toimii erittäin hyvin.

Yleisimmät virheet

  • kaikki kutsutaan suoraan
  • hookit satunnaisesti ympäri projektia
  • event naming sekava
  • liian paljon globaaleja actioneita
  • payloadit epäselviä
  • business logic hook callbackeissa ilman rakennetta

Paras arkkitehtuuri

Moderni WordPress plugin:

  • domain eventit
  • listener-luokat
  • async processing queueilla
  • cache invalidation eventeillä
  • plugin integrations hookien kautta
  • modulaarinen rakenne

Yhteenveto

Event-driven arkkitehtuuri tekee WordPress-pluginien rakenteesta huomattavasti joustavamman ja helpommin laajennettavan. Kun logiikka rakennetaan tapahtumien ympärille eikä suorien riippuvuuksien varaan, järjestelmä pysyy hallittavana myös projektin kasvaessa.

WordPress tarjoaa tähän jo valmiin hook-järjestelmän, joten event-driven-ajattelun käyttöönotto ei vaadi raskaita frameworkeja — vain paremman arkkitehtuurin.

🍪