Toon posts:

[PHP/Composer] Composer gebruikt de verkeerde doctrine

Pagina: 1
Acties:

Vraag


  • Navi
  • Registratie: maart 2007
  • Laatst online: 23:16
In een project waar ik 2 applicaties geinstalleerd hebt wordt door het eerste project soms de verkeerde doctrine ingeladen.

Het is een TYPO3 CMS installatie in de root met een composer.json en een Laravel installatie in een submap, met een eigen composer.json.

Webroot
- composer.json
- vendor\ (typo3 installatie)
- \typo3conf\ext\subapp\laravel\composer.json
- \typo3conf\ext\subapp\laravel\vendor\ (laravel installatie)

In beide projecten wordt Doctrine gebruikt, alleen in de TYPO3 installatie is dat een andere versie dan in de Laravel applicatie.

Probleem zit hem er nu in dat als je in de TYPO3 site een record opslaat, hij deze melding geeft:
Call to undefined method TYPO3\CMS\Core\Database\Connection::fetchAllAssociative()

Na diep debuggen kom ik erachter dat het komt omdat hij in de Laravel doctrine installatie uitkomt:
\typo3conf\ext\subapp\laravel\vendor\doctrine\dbal\lib\Doctrine\DBAL\Schema\AbstractSchemaManager.php

en daar wordt (in listTableColumns) de method fetchAllAssociative aangeroepen, maar de TYPO3 doctrine versie heeft die method nog niet.

Hij had dus eigenlijk hier terecht moeten komen:
\vendor\doctrine\dbal\lib\Doctrine\DBAL\Schema\AbstractSchemaManager.php

want deze versie gebruikt de fetchAllAssociative niet (maar fetchAll).

Als ik tijdelijk de vendor map van laravel weghaal, werkt het gewoon prima. Het lijkt dus echt mis te gaan met het autoloaden.

Is er een manier om in de composer.json aan te geven dat hij specifiek de Doctrine versie in zijn eigen vendor map moet gebruiken?


Handmatig:
"Doctrine\\DBAL\\": "vendor/doctrine/dbal/lib/Doctrine/DBAL",

toevoegen aan het PSR-4 autoload gedeelte in de composer.json van de TYPO3 installatie lijkt niet te werken?


De 2 applicaties samenvoegen in 1 composer.json is helaas geen optie, het moeten echt gescheiden applicaties blijven.

Iemand een idee?

Alle reacties


  • MueR
  • Registratie: januari 2004
  • Laatst online: 00:25

MueR

Moderator Devschuur®

is niet lief

Klinkt alsof typo3 probeert om de classmaps van extensies ook vast te laden, wat natuurlijk grandioos mis gaat bij dezelfde namespaces. Kijk eens wat er in je classmap komt te staan wanneer je composer install --classmap-authoritative voor je typo3 installatie doet? Wordt de Laravel variant dan alsnog gebruikt?

Anyone who gets in between me and my morning coffee should be insecure.
Breng nu uw applicatie naar de kloot. Dat is veel beter! Nu samen met klootopslag. Voor maar €9,95. Doei doei!


  • Navi
  • Registratie: maart 2007
  • Laatst online: 23:16
Heb het even geprobeerd maar het maakt geen verschil. De classmap file bevat ook enkel relatieve paden, niet het absolute pad naar bv de laravel install:

code:
1
2
3
4
5
// autoload_classmap.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
'Doctrine\\DBAL\\Schema\\Column' => $vendorDir . '/doctrine/dbal/lib/Doctrine/DBAL/Schema/Column.php',

  • MueR
  • Registratie: januari 2004
  • Laatst online: 00:25

MueR

Moderator Devschuur®

is niet lief

dirname() geeft absolute paden ;)

Maar de interessante vraag is eigenlijk wel of je vervolgens ook wat van je laravel packages tegenkomt in die classmap.

Anyone who gets in between me and my morning coffee should be insecure.
Breng nu uw applicatie naar de kloot. Dat is veel beter! Nu samen met klootopslag. Voor maar €9,95. Doei doei!


  • DJMaze
  • Registratie: juni 2002
  • Niet online
Geef in de autoloader de juiste prioriteit aan.
Dus dat map B eerder gecontroleerd moet worden dan map A


Gebruik ook niet 1 PHP instance!
Stel je draait OPCache en die heeft in het geheugen "IkBenClassA" omdat de autoloader die heeft geladen.
Roep je dan in project B bijvoorbeeld class_exists('IkBenClassA') dan is die natuurlijk al ingeladen.
Je moet dan dus beide websites compleet van elkaar scheiden.

[Voor 119% gewijzigd door DJMaze op 15-03-2021 16:08]

Maak je niet druk, dat doet de compressor maar



Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee