Toon posts:

[PHP/Composer] Composer gebruikt de verkeerde doctrine

Pagina: 1
Acties:

Vraag


  • Navi
  • Registratie: Maart 2007
  • Nu online
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: 11:40

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
  • Nu online
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: 11:40

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



Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee