SetOptions pri vytvarani sluzby uz v konstruktore

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
westrem
Člen | 398
+
0
-

Ahoj,

uvital by som, ak by sa $options predavali vytvaranej sluzbe uz v konstruktore a nie o krok neskor za pomoci setOptions.

V samom kode aplikacie je napisane „TODO better!“

Osobne pouzivam services v konfigu na vytvorenie sluzieb, ktore aplikacia potrebuje. Tieto sa inicializuju v konstruktore a castokrat su $options potrebne uz tu a nie je mozne pockat na krok setOptions.

Aby bolo jasne o com vravim

Blizzy
Člen | 149
+
0
-

westrem napsal(a):

Osobne pouzivam services v konfigu na vytvorenie sluzieb, ktore aplikacia potrebuje. Tieto sa inicializuju v konstruktore a castokrat su $options potrebne uz tu a nie je mozne pockat na krok setOptions.

Options jdou v configu nastavovat taky, viz: https://forum.nette.org/…-konfigurace

westrem
Člen | 398
+
0
-

Naschval som do postu pripojil link, aby bolo jasnejsie o com vravim. To, ze idu nastavovat $options pre sluzbu viem, to je jasne z toho, ze som pripojil priamo link na miesto kde sa nastavuju.

Ja navrhujem ale zmenu casu kedy su sluzbe predavane. Teraz to totiz funguje takto:

  1. Vytvori sa sluzba (vola sa __construct) (v pripade, ze je v config.ini uvedene aj service.name.run=true)
  2. predaju sa parametre ak existuje metoda setOptions

Pri tychto sluzbach nastava problem ten, ze ak chceme aby hned bezali tak ich potrebujeme mat nastavene od momentu vzniku, resp nastavovat ich v __construct, to vsak nie je mozne, kedze $options sa predavaju az o krok neskorsie, tzn ked uz je sluzba vytvorena.

Dalej, kedze sa toto deje pocas parsovania config.ini tak nemozme volat ani Environment::getConfig(section) pretoze vrati null.

Jedine momentalne schodne riesenie je predavat $options uz pri vytvarani sluzby.

Rozsiahlejsie riesenie, ktore momentalne pouzivam je, ze mam interface IInitializable a za riadok 133

Som si umiestnil nieco taketo

//initialization fix
if ($service instanceof IInitializable) {
    $service->init();
}

Takze nerobim inicializaciu v konstruktore ale pomocou metody init, ktoru musi sluzba implementovat ak je inicializovatelna.

westrem
Člen | 398
+
0
-

Aha, nevsimol som si, ze Nette ma zase raz dvojake chovanie :-/

Ked mam v config.ini nastavene na factory Classname tak sa to chova inak ako ked je tam callback.

Pri callbacku sa robi presne to co popisujem vyssie aby sa robilo aj pri normalnom Classname.