PHP Event Manger

Radim na svojem frameworku malo i evo kako implementirao event manager pa bih zamolio za komentarea.
Eventi su prije svega dobra stvar za ne slamanje dobre OOP prakse kod nekih problema. U PHP ne postoje ali ih skoro sva ozbiljnija rješenja simuliraju.

Funkcionalnost i interface sličan u Javascripta nisam implementirao bubbling, barem ne za sada jer mi netreba.
Bubbling bi funkcionirao tako da bi se event propagirao na instancu klase koja sadržava instancu druge klase i tim rasporedom na sve klase koje su “pretplaćene” na bubbling. No to je samo neka ideja, zasad još netreba.

Već sam kod jedanog projekta implementirao evente no ovaj put ispala jako jednostavno.
Zanimalo bi me vaše mišljenje i mane.

Event abstrakt klasa koja se mora nasljediti.

Primer korištenja:

svidja mi se, lijepo znanje php-a, premda nisam radio sa class abstraction u php-u…

imam jedno pitanje vezano za method dispatchEvent, mozda sam krivo shvatio pa nemoj zamjeriti ako lupim glupost, jel ne bi bilo bolje napraviti taj method isto abstract da sigurno argumenti moraju biti jednaki kad kasnije to koristis u nekoj drugoj klasi, ovako nesto:

mozda sam to i krivo shvatio pa ako ne da mi objasnis zasto je bolje da bude public…

Probaj vidjeti:
http://www.yiiframework.com/wiki/44/behaviors-events/

Posebno zadnji komentar. :smiley:

Klasu sam stavio abstract jer nebi smjela postojati unutar aplikacije kao instanca, a metode su implementirane i extendana klasa ih ne mora reimplementirati.

E vidio sam YII, proučavao tjedan dana, otuda sam i pokupio da evente počinjem sa on, no YII kao i drugi frameworci imaju kompleksnu implementaciju a moj framework ide u drugom smjeru. Pokušava zadržati funkcionalnost, a uz to biti jednostavan. A mislim da je ovo čist dosta da bi se dobilo handlanje eventa. Još uz to vjerovatno ću probati bubbling napraviti, jer to mi je usko vezano za template engine.

Gledam kod i čudim se, 90% je identično mom event hendleru, radi fino :slight_smile: i +1 na Gosaricev komentar :slight_smile:

Meni je cilj bio izbjeći takve evente jer se radi o global eventima svaki put kad se izvrše, cijela aplikacija ako se ne varam ima pristup eventu.
Radi se o frameworku koji je dizajniran za izradu web aplikacija sa naglaskom na front endu (sve je ustvari podređeno klijent strani) i zato će možda trebati bubbling (što postoji u JS) ali global eventi su van svakog razmišljanja.

No mogu ih izvesti preko Singleton dizajn patterna kojeg sam prekopirao iz Magento i ustvari je vrlo jednostavan.

A nije pogriješio sam izgleda da su ovi eventi sa gosarićevog primjera nisi dostupni kroz cijelu aplikaciju.

Upoznat sam Magento eventima koji su globalni mogu se dohvatiti bilo otkuda iako se čini dosta dobro za nadogradnju, Magento je ipak specijalizirani software a i tamo takvi globalni evente mogu uzrokovati probleme.
Recimo da ih netko redispatcha u svojoj ekstenziji i onda sustav dobi dva eventa a očekivano jest da bude jedan.

Iskreno rečeno, ja ne koristim evente, barem ne kao takve. Ja sam slijepo preuzeo ovu metodologiju, primjer -
http://uniprogy.com/docs/worklets/form

  • i samo mogu reći da sljedećih par godina ne vidim što bi se moglo promijeniti na svim ostalim frameworcima da ovo ispustim, barem što se tiče mojih projekata kao freelancing. :slight_smile:

PS: ne znam jel ima na sajtu, ali kako su tu riješeni filteri i behaviori (na neki nacin i eventi) - to je jednostavno perverzija, ali za manje projekte se baš ne isplati.

Ako netko isprobao gornji event manager ili radi sa sličnim principom u eventima neka javi jeli uspio koristiti array a da se prenosi kroz referencu kroz parametre eventa.
Malo sam pokušavao a nisam uspio već parameter moram prenositi kroz objekt da bi sa parametrima u listeneru mogao raditi.

Što mislim reći:

$paramObject se stanje može mjenjati u eventu listeneru, no ako umjesto $paramObjecta koristim array stvar ne radi.
Nije neki problem jer je lako prenjeti napraviti objekt možda je i kvalitetnije ali me stvarno zanima jel netko uspio to uraditi sa array ili radi tako u nekom sličnom okruženju.
Mislim da i u Magentu se stalno prenose objekti kroz evente. Oni se prosljeđuju prema referenci ali očito da tako nije sa arrayom.