Autor Zpráva
ShiraNai7
Profil
Navrhuji event systém (systém událostí) pro framework v PHP, který musí být dostupný kdykoliv v celé aplikaci a narazil jsem na jedno dilema - a to: Kam ukládat a jak načítat registrované události?

1) Absolutně zavrhnutá je tato možnost (jestli to tak vůbec někdo řeší):
~ neukládat nikam, načítat při spuštění frameworku všechny rozšíření a postupně registrovat události

To by bylo při větším počtu pluginů zbytečně náročné.


2) Ukládat události do databáze (v databázi by byl jen název/id třídy, události a callback) a:
a) načítat všechny události při použití třídy event systému NARÁZ (tj. jeden velký dotaz) při tom že událostí by běžně bylo tak 10-20
b) načítat události podle potřeby po jednom (tj. jedna spuštěná událost = 1 dotaz do tabulky)


3) Ukládat události do PHP souboru, který se jednou načte pomocí include a pomocí return vrátí pole se všemi událostmi
To mi připadá jako asi nejefektivnější možnost (volně spravovat ono pole v souboru nemám žádný problém), ale přesto bych rád znal váš případný názor či zkušenosti s tímto problémem.
Jan Tvrdík
Profil
Obávám se, že jsem to nepochopil. Tak aspoň přihodím pravděpodobně zcela zbytečný odkaz: http://doc.nette.org/cs/nette-object#toc-udalosti
ShiraNai7
Profil
Prostě mám data.... "události" které obsahují jméno oné události, jméno třídy a jméno metody, která se má volat. A v dotazu se ptám na nejvhodnější způsob uložení a následného načítání těchto dat.
DoubleThink
Profil *
Možná bys mohl doplnit, co přesně myslíš tou událostí. Skutečný event framework PHP nemá, je to synchronní jednovláknový interpret. Asynchronní události v něm nevznikají.
ShiraNai7
Profil
DoubleThink:
Kdekoliv v kódu se objeví například něco takového (systém je teprve v návrhu):
Event::fire('User', 'account.register');

Při registraci uživatelského účtu (jen příklad). Jsou to události, které jsou ručně vyvolány tam, kde se hodí mít možnost tímto způsobem něco sledovat (stalo se) nebo i ovlivnit.

A metoda fire si nějakým způsobem (popsáno v mém prvním příspěvku) zjistí, co má zavolat. Řeším právě to ukládání těchto "registrovaných událostí" či triggerů chcete-li.
Jozin
Profil
Ahoj,

pokud je každá registrovaná událost třída (plugin), nestačí tedy použít to, že jsou všechny pluginy v určité složce a metoda fire vyhledává v nich třídu, kterou zrovna chce použít? Potom by se nemuselo nic upravovat. Jednoduše nechci možnost registrace, tak odstraním plugin registrace a aplikace jej pak nenačte.

Jozin.
Mike8748
Profil
ShiraNai7:
pročpak variantu #1 tak moc absolutně zavrhuješ? to o zátěži máš ověřené nebo si to myslíš?

přecijenom návrhový vzor Observer (v php dostupný základ jako SPL interface SplObserver/SplSubject) je docela častý

A metoda fire si nějakým způsobem
na to aby jsi mohl zjistit co se má volat tak tě napřed ta volaná věc (metoda třídy, funkce,..) musí informovat o tom že volána být chce... tedy jsi zpět (a stále) u #1

edit: jinak #3 je v podstatě to samé jako #1, akorát registrace nebude prováděna naživo při běhu php skriptu ale zapsáním volané metody do souboru s php polem pro danou událost. tím to ovšem vznikne další zátěž v podobě diskových operací
__construct
Profil
ShiraNai7:
To čo popisuješ má pekne vyriešené Yii FW.
ShiraNai7
Profil
Mike8748:
musí informovat o tom že volána být chce

Fakt, že chce být volána, je právě už zaregistrován v těch datech. Není třeba žádná další asistence oné třídy, až v připadě volání daného callbacku (to už pak má na starosti autoloader).

pročpak variantu #1 tak moc absolutně zavrhuješ?

Aby se načítalo dejme tomu 20 PHP souborů s třídami jen protože je tak nějaká nevelká šance, že nastane událost, kterou chce zpracovat jedna z těchto tříd, je celkem zbytečné.

__construct
Ono se nejedná o "jednorázové" události, ale o "dlouhodobé", které se zpracují pokaždé, když jsou vyvolány.



Každopádně děkuji za reakce, i když jsem asi nebyl schopen přesně vysvětlil svůj problém, resp. to, jak to vlastně má fungovat.
xxxObiWan
Profil
ShiraNai7:
1) Absolutně zavrhnutá je tato možnost (jestli to tak vůbec někdo řeší):
>
~ neukládat nikam, načítat při spuštění frameworku všechny rozšíření a postupně registrovat události

Řeším stejné dilema v mojem CMS postaveném na Nette frameworku, ale nakonec jsem si vybral právě tenhle první způsob. A aby se nemusely všechny soubory a třídy načítat při každém požadavku na zobrazení stránky, tak jejich registrované události (a další věci) kešuju pomocí Nette\Caching\Cache. Nemám totiž rád, když mi tyhle věci zbytečně "zaplácávají" DB :-)
ShiraNai7
Profil
xxxObiWan:

Já to dám do PHP souboru, takže se nebudou muset načítat všechny třídy a ani zatěžovat databáze. Správu onoho souboru jde pěkně obalit v OOP, takže bude de facto jedno, kam se fyzicky ukládá.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0