Nový projekt s Composerem a Kdyby\Doctrine vrací Nette\InvalidStateException

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

Zdravím

Narazil jsem na zajímavou chybu. Založil jsem si nový projekt přes Composer: composer create-project nette/sandbox test

Potom jsem přesně podle návodu přidal Kdyby\Doctrine: composer require kdyby/doctrine:@dev a podle dalšího návodu doplnil bootsrap.php:

<?php
Kdyby\Console\DI\ConsoleExtension::register($configurator);
Kdyby\Events\DI\EventsExtension::register($configurator);
Kdyby\Annotations\DI\AnnotationsExtension::register($configurator);
Kdyby\Doctrine\DI\OrmExtension::register($configurator);
?>

Přesto dostávám jen Nette\InvalidStateException
Ambiguous class Doctrine\Tests\DoctrineTestCase resolution; defined in /var/www/project/ebd/libs/doctrine/inflector/tests/Doctrine/Tests/DoctrineTestCase.php and in /var/www/project/ebd/libs/doctrine/collections/tests/Doctrine/Tests/DoctrineTestCase.php

Nějaký nápad, kde by mohl být zakopaný pes?

PHP Version 5.4.6, Nette Framework 2.0.12

David Matějka
Moderator | 6445
+
0
-

doctrina stejny classy ve vice projektech, nejlepsi je vypnout robot loader, aby neskenoval /libs slozku, ale pouze /app (najdes to v bootstrap.php)

enumag
Člen | 2118
+
+1
-

@matej21: Nejlepší je neměnit composeru konvence a instalovat normálně do složky vendor (a tu samozřejmě nedávat robotloaderu). Složka libs je fajn na jednoduché třídy na které se nehodí vytvářet composer package.

David Matějka
Moderator | 6445
+
0
-

@enumag: jo, vendor je lepsi, bohuzel v nette sandboxu to dlouho bylo na libs, tak to tak ve spouste projektu zustava :)
ja pro jednoduchy tridy, ktery jsou pouze soucasti aplikace, pouzivam radsi slozku app/libs

enumag
Člen | 2118
+
0
-

@matej21: Vím, taky jsem na to nadával jak špaček. :) Vše co se týká aplikace samozřejmě mám v app, do libs dávám věci typu vlastní shortcut na barDump, což není specifické pro aplikaci.

Editoval enumag (7. 10. 2013 23:31)

Richard Faila
Člen | 40
+
0
-

Mě šlo spíš o fakt, že ačkoliv jsem postupoval podle návodu, tak výsledek moc nefungoval.

Když v bootstrap.php vypnu Robotloader na složce libs (PS: zajímalo, jakože to funguje, když tam jsou i soubory samotného Nette) dostávám pro změněnu hlášku:

Declaration of Kdyby\Doctrine\DI\OrmExtension::afterCompile() should be compatible with that of Nette\Config\CompilerExtension::afterCompile()

David Matějka
Moderator | 6445
+
0
-

jo, ten navod je asi pro dev verzi nette. ve stable (2.0) zkus do composeru dat verzi dev-nette-2.0 misto soucasneho dev-master (resp. @dev)

Filip Procházka
Moderator | 4668
+
0
-

Ahoj, díky za upozornění, informaci jsem aktualizoval. Příště bych poprosil založit issue na githubu, tam si toho všimnu dříve :)

enumag
Člen | 2118
+
0
-

PS: zajímalo, jakože to funguje, když tam jsou i soubory samotného Nette

Nette je instalováno přes Composer a ten si autoloading dělá po svém. Stačí že v Nette je tohle.

David Klouček
Člen | 57
+
0
-

Taky jsem dostával Ambiguous class, tak jsem zkoušel rady vejš a pořád dostávam Fatal Error Class 'Kdyby\Annotations\DI\AnnotationsExtension' not found. Momentálně mám všechny knihovny ve složce projekt/libs a robot loader zaplej pro projekt/app. Už nevim co s tim, neměl by tam nějak zafungovat autoloading?

Řádka s errorem:

Kdyby\Annotations\DI\AnnotationsExtension::register($configurator);
duskohu
Člen | 778
+
0
-

David Klouček napsal(a):

Taky jsem dostával Ambiguous class, tak jsem zkoušel rady vejš a pořád dostávam Fatal Error Class 'Kdyby\Annotations\DI\AnnotationsExtension' not found. Momentálně mám všechny knihovny ve složce projekt/libs a robot loader zaplej pro projekt/app. Už nevim co s tim, neměl by tam nějak zafungovat autoloading?

Řádka s errorem:

Kdyby\Annotations\DI\AnnotationsExtension::register($configurator);

Predpokladam ze si neinstaloval cez composer ked to mas vsetko v libs, tak pridaj do robot loadru aj adresar libs. Ale urcite ti odporucam pouzivat composer, velmi si ulahcis pracu.

David Klouček
Člen | 57
+
0
-

duskohu napsal(a):

Predpokladam ze si neinstaloval cez composer ked to mas vsetko v libs, tak pridaj do robot loadru aj adresar libs. Ale urcite ti odporucam pouzivat composer, velmi si ulahcis pracu.

Stahoval, ale zas sem to přesunul. Když zapnu ten robot loaderu tak zas budu dostávat Ambiguous class Doctrine\Tests\DoctrineTestCase resolution.

Teď jsem ty třídy teda rozdělil do 2 složek:

vendor - knihovny stahovaný composerem (nette, kdyby/doctrine, doctrine, symfony/console)
libs - moje knihovny

A teď ať zapnu či vypnu robot loader pro jednu z těch složek, buď dostávam Class Not Found nebo Ambiguous class.

Filip Procházka
Moderator | 4668
+
+2
-

Nedělej v tom bordel, nekompiluj to, použíj composer, udělej to pořádně a tak jak se má.

Mysteria
Člen | 797
+
-2
-

@David Klouček: Na stejný problém jsem narazil, když jsem si dával Kdyby/Doctrine dokupy zvlášť bez Composeru. Problém je v testech Doctrine2, takže normálně smaž složku tests/Doctrine/Tests. Pak to bez problémů funguje i s RobotLoaderem. :)

David Klouček
Člen | 57
+
0
-

Vždyť já to stahuju composerem, jen ale prostě nevim co dalšího udělat abych nedostával jednu z těch hlášek. V podstatě postupuju podle návodu https://github.com/…/en/index.md.

@Mysteria
Máš pravdu, takhle sem to původně měl. Ale to budu muset mazat pokaždý a to se mi zdá právě divný.

Editoval David Klouček (5. 8. 2014 10:57)

David Kudera
Člen | 455
+
0
-

Mysteria napsal(a):

@David Klouček: Na stejný problém jsem narazil, když jsem si dával Kdyby/Doctrine dokupy zvlášť bez Composeru. Problém je v testech Doctrine2, takže normálně smaž složku tests/Doctrine/Tests. Pak to bez problémů funguje i s RobotLoaderem. :)

<irony>
Jak se říká, rada nad zlato, že? :-) jen je teda blbý, že takhle se ten composer ty lidi nenaučí a budou řešit pořád další a další zbytečný problémy
</irony>

Edit: jako bych nic neřek ;-)

Editoval David Kudera (5. 8. 2014 10:54)

Mysteria
Člen | 797
+
-5
-

@David Klouček: Instalace přes Composer na čistým Nette 2.2.2 sandboxu funguje v pohodě (testováno včera).

@David Kudera: Tohle je diskutabilní – ano, v projektu, kde budu mít 20+ knihoven to asi má smysl, ale u svých cca 7 používaných knihoven si to radši postahuju a zkompletuju samostatně a je to taky bez problémů a ještě mám strukturu takovou, jakou já chci. :)

MartinitCZ
Člen | 580
+
+7
-

@Mysteria Má to smysl i u jedné jedinné knihovny.
Ty doby, kdy jsem to musel stahovat ručně, rozbalovat, vkládat, sám kontrolovat aktualizace jsou, díky bohu, pryč. Byla to nehorázná otrava, už to nechci zažít!

Editoval MartinitCZ (5. 8. 2014 13:36)

Filip Procházka
Moderator | 4668
+
+2
-
  • vytvořit čistý composer.json (bez těch pičovin s config-dir: libs, a nebo nově vendor/others)
  • nastavit závislosti
  • composer update
  • smazat načítání libs (a nebo vendor/others) robotloaderem
  • načítat vendor/autoload.php
  • profit