Aplikace mi začla zobrazovat Nette\InvalidStateException

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

Aplikace mi během nějakých úprav začala házet traceback viz níže. Jednu z posledních úprav jsem dělal do boostrapu a config.neon a tak jsem oba rollbacknul do původních verzí ale stejně stále stejný problém. Popravdě nevím čeho bych se měl chytit … nemáte nějaký tip?


Nette\InvalidStateException

Ambiguous class Doctrine\Tests\Common\Reflection\SameNamespaceParent resolution; defined in C:\apache\htdocs\nette\libs\doctrine\common\tests\Doctrine\Tests\Common\Reflection\DeeperNamespaceParent.php and in C:\apache\htdocs\nette\libs\doctrine\common\tests\Doctrine\Tests\Common\Reflection\SameNamespaceParent.php. search►

Source file ►

Call stack ▼

inner-code Nette\Loaders\RobotLoader-> _rebuildCallback (arguments ►)

…\libs\nette\nette\Nette\common\Callback.php:115 source ► call_user_func_array (arguments ►)

…\libs\nette\nette\Nette\Caching\Cache.php:134 source ► Nette\Callback-> invokeArgs (arguments ►)

…\libs\nette\nette\Nette\Caching\Cache.php:104 source ► Nette\Caching\Cache-> save (arguments ►)

…\libs\nette\nette\Nette\Loaders\RobotLoader.php:69 source ► Nette\Caching\Cache-> load (arguments ►)

…\app\bootstrap.php:21 source ► Nette\Loaders\RobotLoader-> register ()

11: $configurator->enableDebugger(__DIR__ . ‚/../log‘);
12:
13: // Specify folder for cache
14: $configurator->setTempDirectory(__DIR__ . ‚/../temp‘);
15:
16:
17: // Enable RobotLoader – this will load all classes automatically
18: $configurator->createRobotLoader()
19: ->addDirectory(__DIR__)
20: ->addDirectory(__DIR__ . ‚/../libs‘)
21: ->register();
22:
23: // Create Dependency Injection container from config.neon file
24: $configurator->addConfig(__DIR__ . ‚/config/config.neon‘);
25: $configurator->addConfig(__DIR__ . ‚/config/config.local.neon‘, $configurator::NONE); // none section
…\www\index.php:7 source ► require (arguments ►)

Environment ►

HTTP request ►

HTTP response ►

PHP/5.4.15
Nette Framework 2.0.11 (revision $WCREV$ released on $WCDATE$)

Editoval dmarko (23. 7. 2013 14:06)

norbe
Backer | 405
+
0
-

Jasnější zprávu co máš špatně snad už ani nemůžeš dostat, takže

  1. neboj se číst chybové zprávy (pokud neumíš anglicky, použij překladač) a zapojit mozek :-)
  2. jak v souboru DeeperNamespaceParent.php, tak v souboru SameNamespaceParent.php máš třídu Doctrine\Tests\Common\Reflection\SameNamespaceParent ⇒ musíš tu třídu v DeeperNamespaceParent.php přejmenovat (případně celý soubor smazat, pokud to nepotřebuješ)
grongor
Člen | 31
+
0
-

@dmarko: tak chyba je vcelku výřečná – třída Doctrine\Tests\Common\Reflection\SameNamespaceParent je definována ve dvou souborech. V libs\doctrine\common\tests\Doctrine\Tests\Common\Reflection\DeeperNamespaceParent.php a v libs\doctrine\common\tests\Doctrine\Tests\Common\Reflection\SameNamespaceParent.php

Nevím, jak se ti to podařilo. Zkus ten Doctrine z libs smazat a nahraj ho tam znovu, případně pokud testy nepotřebuješ tak smaž celou složku tests v libs/doctrine/common (tipuju, že ti to stejně nic neříká).

David Matějka
Moderator | 6445
+
0
-

koukam, doctrina tam opravdu ma ty stejny tridy. nejlepsi reseni – smazat libs slozku z robotloaderu a o zavislosti at se stara composer a robotloader at prochazi jen app

dmarko
Člen | 6
+
0
-

Ano je to něco v aktuálním Doctrine, já tam samozřejmně nic neměnil a ten balík se natáhl jako závislost přes composer. I jsem to z libs odsraňoval a zavolal composer update, ale je to stejné. Doctrine tam již byl nějakou dobu ale v rámci dnešního composer update se asi aktualizoval na nějakou bug verzi …

Michal Vyšinský
Člen | 608
+
0
-

Když používáš composer, tak RobotLoader vůbec do adresáře libs nemusí – o autoloading se ti stará composer, takže jej z bootstrapu vymaž a je to.

David Grudl
Nette Core | 8233
+
0
-

Composer se nestará o autoloading vlastní aplikace, tohle dělá jen RobotLoader a není důvod ho mazat. Že prochází i složku vendor ničemu nevadí.

David Matějka
Moderator | 6445
+
0
-

no kdyz ma doctrina v tomhle a tomhle tridy se stejnym nazvem, tak vadi :)
je to i zbytecne narocny, ze musi prolizat spoustu knihoven
myslim, ze v oficialnim sandboxu by ten robotloader nemel mit defaultne nastaveno, at proleza libs (resp vendor), akorat to zpusobi takovyhle problemy
ja v libs (vendor) mam jen knihovny, o jejichz nacitani se stara composer, ostatni veci mam v app, ktery robot loader proleza

besanek
Člen | 128
+
0
-

Jenže spousta uživatelů oficiálnílního sandboxu Composer nevyužívají. Pokud by se automatické procházení libs zrušilo, udělalo by to akorád zmatky.

David Matějka
Moderator | 6445
+
0
-

@besanek: nette by se loadovalo porad, v sandboxu je autoload.php, ktery nacita nette loader. ten je potom pripadne prepsan autoload.php z composeru. kdyz clovek pridava dalsi zavislosti, mel by se postarat i o jejich spravny loading (at uz includnutim neceho, pridani adresare do robot loaderu, nebo to nechat na composeru)

ale koukam, ze uz to David vyresil … snad se nejakej vendor nebude jmenovat others :))

enumag
Člen | 2118
+
0
-

@David Grudl:

To tedy vadí. Když vyvíjím nějaký balíček instalovaný přes composer a mám někde typo v názvu souboru (což se mi stalo už hodněkrát) tak autoloading má selhat. V tomto případě ale kvůli RobotLoaderu neselže takže na chybu nepřijdu. Dále to vadí kvůli kolizím v testech, jak už zmínil @matej21. RobotLoader do vendor složky zkrátka lézt nemá.

Kromě toho se composer o autoloading aplikace úplně klidně může starat taky, stačí do composer.json přidat sekci „autoload“, správně ji nastavit a zavolat composer update. Že Nettisté většinou používají RobotLoader je druhá věc a důvody jsou z části historické (+ že téměř nikdo z komunity nedodržuje PSR-0).