Jörg: php verstehe Composer nicht

Hallo Forum,

ich verstehe den composer für php nicht so ganz.

Da ich ihn in meiner php8-Umgebung nicht installiert bekomme (falsche imagick-Version in meiner xampp-Version), habe ich den composer in meiner php 7.4-Umgebung installiert.

Nun habe ich eine php-Bibliotek samt Abhängigkeiten über den composer installiert und ein "vendor-Verzeichnis" erhalten.

Dieses habe ich dann komplett in miene php8-Umgebung kopiert und versucht, ein Script laufen zu lassen, das auf derselben verzeichnisebene wie der vendor-Ordner läuft:

<?php
require 'vendor/autoload.php';

use BaconQrCode\Common\ErrorCorrectionLevel;
use BaconQrCode\Encoder\Encoder;
use BaconQrCode\Renderer\Image\Png;
use BaconQrCode\Writer;



// Daten für den EPC-QR-Code
$iban = 'DE89370400440532013000'; // Ihre IBAN
$name = 'Max Mustermann'; // Ihr Name
$betrag = '50.00'; // Der zu zahlende Betrag
$verwendungszweck = 'Rechnung XYZ'; // Verwendungszweck

// EPC-Daten zusammenstellen
$epcData = "BCD\n002\n1\nSCT\n{$iban}\n{$name}\nEUR{$betrag}\n\n\n{$verwendungszweck}";


// EPC-QR-Code generieren
$renderer = new Png();
$renderer->setHeight(256);
$renderer->setWidth(256);
$writer = new Writer($renderer);
$qrCode = Encoder::encode($epcData, ErrorCorrectionLevel::M());
$writer->writeFile($qrCode, 'epc_qr_code.png');

echo 'EPC-QR-Code wurde erstellt: <img src="epc_qr_code.png">';

Ich erhalte den Fehler:

Fatal error: 
Uncaught Error: 
Class "BaconQrCode\Renderer\Image\Png" not found in 
D:\xampp8\htdocs\test4711\a.php:25 Stack trace: #0 {main} 
thrown in D:\xampp8\htdocs\test4711\a.php on line 25

Wo setze ich nun an?

War bereits das Kopieren des vendor-Ordners aus der php7-Umgebung in die php8-Umgebung der Fehler?

Oder war das gar nicht schlimm und es läuft etwas ganz anderes schief?

Die Verzeichnisstruktur des vedor-Verzeichnis im test4711-Ordner (innerhalb des htdocs) sieht so aus:

vendor

Ich komme hier nicht weiter.
Wer kann mir mal helfen und mir sagen, wie man sowas debugged?

Jörg

  1. Hallo Jörg,

    ich habe den Composer noch nie verwendet und weiß deshalb nicht, ob der Runtime-Komponenten hat.

    Auf jeden Fall muss der Autoloader ja wissen, wie er von einer Klasse incl. Namespace auf den Ort kommt, an dem der Sourcecode der Klasse gespeichert ist, und hier musst Du ansetzen.

    • was tut vendor/autoload.php - ich nehme an, dass die vom Composer mitgebracht oder generiert wird.
    • werden hier ggf. Package-Dateien oder sowas eingelesen, oder ist hier ein Stammordner hart codiert?

    Ansatzpunkt ist jedenfalls die Autoload-Datei. Die registriert mittels spl_autoload_register einen Callback, der bei nicht gefundenen Klassen die richtige Codedatei nachlädt. Das ist generell keine Raketenwissenschaft, sowas habe ich selbst schon geschrieben, aber der Composer wird vermutlich relativ abstrakt an die Sache herangehen. Möglicherweise musst Du hier ein paar Logging-Anweisungen einbauen, um zu schauen, wo etwas schief geht.

    Funktioniert es denn in der 7.4 Umgebung?

    Und bist Du sicher, dass die Imagick-Version ein Composer-Problem ist? Mich dünkt es besser, die Zeit in einen laufenden Composer in PHP 8 zu stecken, als hier einen Workaround zu perfektionieren. Aber von ferne kann ich das natürlich nicht beurteilen, wie gravierend das Problem da ist.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hallo Rolf,

      was tut vendor/autoload.php - ich nehme an, dass die vom Composer mitgebracht oder generiert wird.

      Ja, korrekt.

      • werden hier ggf. Package-Dateien oder sowas eingelesen, oder ist hier ein Stammordner hart codiert?

      Nein, darf ja nicht. Sonst könnte ich doch auch nie vom Testserver auf den Produktivserver einfach kopieren. Das wäre ja jedesmal ein Riesenaufwand?!

      Funktioniert es denn in der 7.4 Umgebung?

      Nein, auch nicht. Allerdings erhalte ich hier nur eine leere weiße seite im Browser.

      Und bist Du sicher, dass die Imagick-Version ein Composer-Problem ist? Mich dünkt es besser, die Zeit in einen laufenden Composer in PHP 8 zu stecken, als hier einen Workaround zu perfektionieren. Aber von ferne kann ich das natürlich nicht beurteilen, wie gravierend das Problem da ist.

      Der composer verlangt bei seiner Indstallation die php.exe (in Windows) und wenn ich sie ihm gebe, bricht er irgendwann die Installation ab und sagt, dass imagick nicht 100% zu php-version passt und sich ggf. seltsam verhalten könnte.

      Das Problem ist, dass ich überhaupt nur 1 imagick-Version für php8 gefunden hatte und froh war, dass die lief. Die verhält sich auch eigentlich nicht seltsam, sondern macht in meinen Anwendungen genau, was sie soll.

      Am allerliebsten hätte ich die Bibliotheken ohne composer installiert, aber heutzutage findet man sowas nicht mehr. Alles läuft heute über den composer, also wird dsas schon Vorteile bringen, wenn auch grad nicht für mich 😉

      Jörg

      1. Hallo Jörg,

        das klingt jetzt nicht wie ein Composer, der mit PHP8 die Arbeit verweigert. Kannst Du die Warnung nicht einfach ignorieren?

        Funktioniert es denn in der 7.4 Umgebung?

        Nein, auch nicht.

        Dann hast Du in 7.4 die Errors so abgedreht, dass Du gar keine Fehler siehst?

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Hallo Rolf,

          das klingt jetzt nicht wie ein Composer, der mit PHP8 die Arbeit verweigert. Kannst Du die Warnung nicht einfach ignorieren?

          Nein, man kann die Installation nur komplett abbrechen.

          Funktioniert es denn in der 7.4 Umgebung?

          Nein, auch nicht.

          Dann hast Du in 7.4 die Errors so abgedreht, dass Du gar keine Fehler siehst?

          Vermutlich, wobei ich mir dessen ansich nicht bewußt bin.

          Bleibt aber die Grundfrage:

          Wenn ich in einer lokalen Testumgebung php-Bibliotheken über composer in ein Projekt installiere, dann muss ich doch auf einen Produktivserver auch ohne composer mein Projekt übertragen können, oder etwa nicht?

          Jörg

  2. Hallo Jörg,

    grad gefunden: PHP/Tutorials/Abhängigkeiten mit Composer verwalten

    Ich würde es auch in PHP8 realisieren, damit alles auf dem neuesten Stand ist.

    Bis bald! Jonathan

    --
    "Ich habe heute ein Elan-Problem und mein Tatenvolumen ist fast aufgebraucht!"