15 komentářů k článku Symfony po krůčkách – Event Dispatcher:

  1. Tomáš VotrubaAutor příspěvku

    Eventy jsou nejmocnější nástroj
    Právě eventy totiž přinášejí Symfony největší flexibilitu a efektivitu poměru cena/výkon.

    Můžeš rozšířit cizí kód, aniž bys do něj zasahoval.

    Ve full-stack frameworku jich najdeš mnoho. Stejně tak v Symfony\Console, Symfony\Security, Composeru, bundlech…

    Jestli tě zajímají do hloubky, mrkni na Year with Symfony. Tam jsou rozebrány do hloubky.

  2. lenoch

    Proč se to nedělá jednodušeji? Např. nějak podobně jako v Nette:

    $order->onFinish = function() { sendMailToAdmin(); }
    
    1. HonzaMarek

      Re:
      1) Nemusím do kódu orderu přidávat onFinish. 2) V momentě dispatchování akce nemusím mít vytvořený objekt $order.

      1. lenoch

        Re:
        Ad 1) No ale musím v kódu orderu zavolat $eventDispatcher->dispatch(‚order.finish‘); ne? Tedy pokud tomu správně rozumím.
        Ad 2) V momentě dispatchování snad order vytvořený být musí? Nemusí být vytvořený v momentě subscribování, to ano, v tom je rozdíl.

        1. Re:

          1. Ano, stejne jako se v nette vola onFinish…
          2. Callback v nette/object je mozna jednodussi, ale je omezen presne jen na nette/object. V dispatcheru muzete odesilat co chcete kdy chcete, klidne jen hole eventy pred vytvorenim nebo po smazani objednavky…
          1. lenoch

            Re:

            1. Ano, to byla reakce na Honzu Marka, tím jsem chtěl říct, že v tomhle nevidím rozdíl.
            2. Ano, tady je volaní/nastavování eventů centralizované v nějakém globálním? objektu. Jen nevím jestli eventuální výhody v praxi opodstatní tu větší složitost.

            Mě totiž symfony obecně připadá (podobně jako jiné fw) zbytečně složité a komplikované (což může být můj problém), takže jsem na tomhle případu zajímal, co mi ta větší komplexita přinese.

            1. Re:

              1. v případě $order rozdíl není – osobně ale nejčastěji (a předpokládám většina programátorů) pracuji s eventama z doctrine nebo přimo ze symfony – tedy z cizího kódu
              2. je to service v di. Callback řeší „události“ objektu, který podědil nette/object, zato EventDispatcher řeší jakékoliv události v aplikaci (a předává v Eventu jakákoliv data). Je to něco jiného, nevím jestli se dá vůbec v nette najít něco srovnatelného…
              1. lenoch

                Re:
                Hm, no tak v případě symfony musí ten objekt odněkud získat objekt EventDispatcher a použít ho, v případě Nette se musí podědit z Nette/Object. Je to trochu jiný typ závislosti, ale zásadní rozdíl v tom aspoň já nevidím. Jakékoliv události lze v Nette obsloužit taky, jakákoliv data lze předat v eventu taky. Ale ok, už toho nechme.

            2. Tomáš VotrubaAutor příspěvku

              Re: Co to přinese?

              …co mi ta větší komplexita přinese?

              Hlavní důvod, proč jsem EventDispatcher integroval do Nette, je možnost využít události mimo Nette ekosystém. Můžeš tedy využít eventy v Symfony, Composeru, Consoli apod. a spoustu dalších, které událost definiují jenom jako string, nevyžadují property ani další magii.

              Zároveň můžeš použít události životního cyklu Nette aplikace a to obojí pěkně v jedné službě.

              Jak by ses třeba dostal k události ‚console.command. v Symfony\Console?

              1. lenoch

                Re: Co to přinese?
                Ok, tento důvod chápu – pokud mám spoustu kódu třetích stran, který využívá symfony EventDispatcher, tak pochopitelně musím používat EventDispatcher, když s ním pracuji.

    2. Tomáš VotrubaAutor příspěvku

      Re: Kód se čte 10x častěji než píše
      Symfony je zaměřeno na střední a větší aplikace, kde je mnohem větší důraz na čitelnost a srozumitelnost kódu.

      Z tvého jednoduchého kódu lze vyčíst pouze to, že nějaká property má v sobě callback. Co se děje dál není jasné a vyžaduje další znalost (coupling) Nette a/nebo jiného rozšíření.

      To je imho největší rozdíl. Syntaxe je implementační detail.

      V praxi jsem si osvědčil, že začátečník mnohem lépe chápe třídu, která volá metodu s argumenty, než přířazení callbacku do property. Kolegové v práci tak pochopili EventDispatcher hned.

      1. lenoch

        Re: Kód se čte 10x častěji než píše
        Tak je pravda, že Nette řešení využívá určitou magii rozšiřující vlastnosti php, ale přiřazení callbacku do onFinish a pak volání $this->onFinish($parametry) ve třídě mi připadá značně intuitivní a v řadě jazyků (javascript) lze něco podobného udělat implicitně.

        Ale budiž, co je čitelné a srozumitelné je subjektivní věc, nechci se přit.

        Já osobně vidím největší potenciální výhodu toho symfony systému v tom, (už to někdo zmiňoval), že ta obsluha výjjimek je mimo využívající objekt, který ji pouze odněkud převezme a pak použije a teoreticky mu můžu například dodat i nějakou jinou implementaci EventDispatcheru.

        Takže shrnuto vidím to tak, že symfony je víc „decoupled“ a potenciálně o něco flexibilnější, nette je (alespoň pro mě) v tomhle jednodušší a stručnější.

  3. Dvojak

    Nechapu workflow
    Ja tomu asi moc nerozumim. Objekt subscriberu je do dispatcheru pridavan ve chvili, kdy je event „vyhozen“. Ale v tu chvili preci nemuze programator vedet, jake vsechny subscibery budou v budoucnu event odchytavat a novy programator, ktery subsciber vytvari, pak naopak (pravdepodobne) nemuze upravovat misto, kde byl event dispatchnut.

Napsat komentář

Tato diskuse je již příliš stará, pravděpodobně již vám nikdo neodpoví. Pokud se chcete na něco zeptat, použijte diskusní server Devel.cz

Zdroj: https://www.zdrojak.cz/?p=16585