Poznámka k funkčnosti samostatných projektů (NDebugger a dibi) i obecně

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

Souvisí s Jak rozdělit Nette do samostatných projektů

I když se problém samotný týkal hlavně dibi, myslím si, že podobné problémy mohou nastat i při osamostatňování jiných částí a proto píšu na fórum nette.

Reálná zakázka – napojit se na nějaké API, stáhnout data, zajistit aktualizaci, udělat vyhledávání nad daty. To vše pro existující projekt, který o Nette ani netuší.

Můj modul je samostatný, pracující se svou databázi, jediné propojení bude přes třídu poskytující hlavní aplikaci data. Dobrá, udělám si to po svém, bez laděnky nepracuji a jsem zvyklý na dibi.

  • mám svůj jednoduchý konfigurák kde si inicializuji NDebugger a dibi
  • pár svých tříd, pár úloh do cronu
  • vše běží v pořádku
  • data se stahují, chyby logují, ošetřují nebo opravují sporadické chyby způsobené výpadky na straně externího API

Zbývá poslední – poskytování dat hlavní aplikaci

  • vytvořím třídu, dle specifikace
  • použiji stále stejný svůj konfigurák, ale přidám flag, protože během přístupu z hlavní aplikace nechci používat laděnku pokud neladím, chyby si ošetřují sami a navíc bych zachytával jejich chyby o kterých nechci nic vědět
  • ale chci používat dibi, takže dibi ponechám aktivní
  • udělám testovací skript s příklady volání, kde vše otestuji, vše funguje

Napíšu – stačí vložit tento jediný soubor tam kde budete chtít používat tuto třídu a vše bude fungovat – a nefunguje

LogicException : Class Nette\Diagnostics\IBarPanel could not be loaded

WTF? Vždyť laděnku v tomto případě ani nevkládám?

No jo, ono tam mají někde v tom projektu autoloading.

  • vyřešil jsem to přidáním druhého parametru $autoload = false do všech tří výskytů funkce interface_exists v dibi.min.php:
if (interface_exists('Nette\Diagnostics\IBarPanel', false)) {

K tomu mám teď otázky, na které zatím nevím správné odpovědi:

  1. Je potřeba použít funkci interface_exists s aktivním autoloadingem?
  2. Šlo by tento můj problém vyřešit nějak jinak bez zásahu do zdrojáku dibi?
  3. Obecně – měly s podobnými možnými problémy samostatné moduly počítat a mít takové situace ošetřené? Nebo alespoň možné problémy zmiňovat v dokumentaci?
  4. Myslím, že by se mi hodila i funkce NDebugger::disable() – že bych Debugger aktivoval jen uvnitř „svého“ modulu, případně jen pro nějaké kritické funkce, které si chci sám sledovat – ale pořádně jsem to nepromýšlel – nevím jestli je to reálné a jestli to není scestná úvaha
David Grudl
Nette Core | 8129
+
0
-

To vypadá jako chyba autoloadingu.