Autor | Zpráva | ||
---|---|---|---|
ShiraNai7 Profil |
#1 · Zasláno: 15. 5. 2011, 21:57:29
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 |
#2 · Zasláno: 15. 5. 2011, 23:52:30
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 |
#3 · Zasláno: 16. 5. 2011, 00:10:15 · Upravil/a: ShiraNai7
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 * |
#4 · Zasláno: 16. 5. 2011, 03:08:09
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 |
#5 · Zasláno: 16. 5. 2011, 12:20:47
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 |
#6 · Zasláno: 16. 5. 2011, 14:33:59
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 |
#7 · Zasláno: 16. 5. 2011, 14:44:50 · Upravil/a: Mike8748
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 |
#8 · Zasláno: 16. 5. 2011, 14:50:04
ShiraNai7:
To čo popisuješ má pekne vyriešené Yii FW. |
||
ShiraNai7 Profil |
#9 · Zasláno: 16. 5. 2011, 15:15:02
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 |
#10 · Zasláno: 16. 5. 2011, 15:37:17
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 |
#11 · Zasláno: 16. 5. 2011, 15:48:30
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á. |
||
Časová prodleva: 13 let
|
0