Die Wiederverwendung von Code bringt das Problem des Abhängigkeitsmanagements mit sich, das traditionell ein eher manueller und fehleranfälliger Prozess ist. Glücklicherweise haben die meisten Programmiersprachen dieses Problem in den letzten Jahren durch die Einführung verschiedener Tools für das Abhängigkeitsmanagement gelöst. Im PHP-Ökosystem hat sich der Composer dank seiner Benutzerfreundlichkeit, Flexibilität und weiten Verbreitung zum Standard entwickelt.

Auch wenn Composer für die Verwaltung von Abhängigkeiten entwickelt wurde, kannst du ihn auch für andere Aufgaben verwenden:

  • Autoloading: Automatisches Laden von Klassen und Funktionen aus externen Bibliotheken, um sie in deinem Code leicht zugänglich zu machen und die Integration von externem Code in dein Projekt zu vereinfachen.
  • Codegenerierung: Erstelle Standardcode für dein Projekt, wie z. B. Konfigurationsdateien oder andere häufig verwendete Codeschnipsel, um den Entwicklungsprozess zu beschleunigen und Konsistenz zu gewährleisten.
  • Skripting: Ein integriertes Skripting-System kann gängige Aufgaben automatisieren, z. B. die Durchführung von Tests oder die Erstellung von Dokumentation aus deiner Codebasis. Dies kann dazu beitragen, deinen Entwicklungsprozess zu rationalisieren und die manuelle Arbeit zu reduzieren.

Diese Anleitung führt dich Schritt für Schritt durch die Erstellung deines eigenen Composer-Pakets und dessen Veröffentlichung auf Packagist, einem Repository für PHP-Pakete, das Entwickler auf der ganzen Welt in ihren eigenen Projekten nutzen können.

Wie funktioniert Composer?

Zuerst müssen wir sicherstellen, dass wir Composer verstehen. Einfach ausgedrückt: Composer arbeitet mit einer composer.json-Datei, die die Definitionen für die Abhängigkeiten in deinem PHP-Projekt enthält. Er sucht diese Pakete in einem zentralen Repository und lädt diese Abhängigkeiten dann automatisch herunter und installiert sie über das Package Repo.

Angenommen, du hast Composer bereits in deiner PHP-Arbeitsumgebung installiert, so sieht der Prozess des Herunterladens und der Installation der Abhängigkeiten folgendermaßen aus:

  1. Definiere die erforderlichen Abhängigkeiten für dein Projekt in einer composer.json-Datei im Stammverzeichnis deines Projekts. Diese Datei enthält Informationen über die benötigten Bibliotheken und ihre Versionen sowie alle anderen Konfigurationseinstellungen oder Abhängigkeiten für diese Bibliotheken.
  2. Du kannst die Abhängigkeiten im Composer mit Befehlen wie install auflösen, um die erforderlichen Abhängigkeiten zu installieren, update, um bestehende Abhängigkeiten zu aktualisieren, und require, um neue Abhängigkeiten zur composer.json-Datei hinzuzufügen. Wenn du einen Befehl ausführst, liest der Composer die composer.json-Datei, um die erforderlichen Abhängigkeiten zu ermitteln, sucht im Paketarchiv nach der neuesten Version jeder Abhängigkeit, die für deine PHP-Umgebung geeignet ist, und prüft dann auf Konflikte oder Versionseinschränkungen.
  3. Der Composer lädt die erforderlichen Abhängigkeiten, einschließlich der Bibliotheken, herunter und installiert sie in das Vendor-Verzeichnis deines Projekts. Der Composer erstellt eine composer.lock-Datei, in der die genauen Versionen der installierten Abhängigkeiten festgehalten werden.
  4. Der Composer richtet einen Autoloader ein, der automatisch Klassen und Funktionen aus den installierten Abhängigkeiten lädt. So kannst du die installierten Bibliotheken ganz einfach in deinem Projekt verwenden, ohne dass du jede Datei manuell einbinden musst.

Kurz gesagt: Composer vereinfacht die Verwaltung von Abhängigkeiten in PHP-Projekten und macht es einfach, externe Bibliotheken und Frameworks zu installieren, zu aktualisieren und zu nutzen.

Erstellen und Veröffentlichen eines Composer-Pakets

Dieses Tutorial zeigt dir, wie du eine einfache PHP-Bibliothek namens tempconv erstellst, die Celsius-Temperaturen in Fahrenheit umwandelt und umgekehrt, und wie du sie als Composer-Paket veröffentlichst.

Voraussetzungen

Bevor du anfängst, musst du ein paar Dinge vorbereiten:

  • PHP und Composer müssen ordnungsgemäß auf deinem System installiert sein. Zum Zeitpunkt der Erstellung dieses Artikels ist die neueste Composer-Version v2.6.6, aber diese Anleitung sollte mit jeder v2-Variante funktionieren.
  • Ein GitHub-Konto, um ein Repository zu erstellen, in dem dein Code gespeichert wird.
  • Ein Packagist-Konto, um deine Bibliothek zu veröffentlichen.

Erstelle ein Projekt-Repository

Erstelle dein eigenes GitHub-Repository für dieses Tutorial, in das du deinen fertigen Bibliothekscode und deine Dateien hochladen kannst.

Screenshot der Seite, die beim Erstellen eines Repositorys auf GitHub angezeigt wird.
Erstellen des Projektarchivs auf GitHub

In diesem Lernprogramm wird der Projektname tempconv verwendet. Gib im Feld Beschreibung kurze Informationen über die Anwendung an. Aktiviere das Kontrollkästchen, um eine README-Datei hinzuzufügen, wähle die Composer-Vorlage für die Option .gitignore hinzufügen und wähle eine Lizenz deiner Wahl – in diesem Lehrgang wird die MIT-Lizenz verwendet. Zum Schluss klickst du auf Repository erstellen.

Das Repository klonen

Klone das Repository, das du gerade erstellt hast, auf deinen lokalen Rechner. Vergiss nicht, die URL durch deine eigene zu ersetzen, sowohl hier als auch in diesem Leitfaden:

$ git clone https://github.com/rexfordnyrk/tempconv.git

Dadurch wird ein Verzeichnis namens tempconv in deinem aktuellen Arbeitsverzeichnis erstellt. Zu diesem Zeitpunkt enthält es nur die Dateien README.md, LICENSE und .gitignore, aber du wirst hier auch deine Paketdateien erstellen.

Erstellen deiner PHP-Bibliothek

Füge in deinem Projektverzeichnis eine Datei namens TemperatureConverter.php mit folgendem Code hinzu:

<?php

namespace Rexfordnyrk\Tempconv;

class TemperatureConverter
{
    //Caller must provide the temperature value and the unit either C Celsius or F Fahrenheit
    public function convert($temperature, $unit)
    {
        //Checking whether the unit we're working with is Celsius or Fahrenheit
        if ($unit === 'C') {
            $fahrenheit = ($temperature * 9 / 5) + 32;
            return $fahrenheit;
        } elseif ($unit === 'F') {
            $celsius = ($temperature - 32) * 5 / 9;
            return $celsius;
        } else {
            //Throwing error if the unit provided is neither C nor F
            throw new \InvalidArgumentException('Invalid unit, only C (Celsius) or F (Fahrenheit) are allowed');
        }
    }
}

Diese Klasse hat eine einzige Methode namens convert, die die Temperatur und die Einheit als Argumente annimmt und die umgewandelte Temperatur zurückgibt. Sie löst eine Ausnahme aus, wenn die Einheit ungültig ist.

Das ist genug für den Moment. In einem realen Szenario würdest du wahrscheinlich Unit-Tests schreiben, um sicherzustellen, dass dein Code nach Änderungen oder Aktualisierungen wie erwartet funktioniert.

Erstelle dein Composer-Paket.

Wenn du deinen Bibliothekscode fertiggestellt hast, ist es an der Zeit, ihn zu einem Composer-Paket zu machen. Mit einem Schritt-für-Schritt-Assistenten erstellst du eine composer.json-Datei für dein Paket und wir besprechen einige Best Practices für die Organisation deines Codes als Paket, bevor du es in dein Repository einstellst.

Erzeugen einer composer.json-Paketdatei

Du kannst den Inhalt einer composer.json-Datei zwar manuell in das Stammverzeichnis deines Projekts schreiben, aber es ist besser, sie mit dem folgenden Composer-Befehl zu erstellen:

$ composer init

Dieser Befehl führt dich durch einen kleinen Schritt-für-Schritt-Assistenten. Die Antworten, die du auf Fragen wie Paketname, Beschreibung, Autoreninformationen und Lizenztyp gibst, erzeugen die composer.json-Datei deines Pakets.

In der Composer-Dokumentation findest du die erwarteten Werte sowie weitere Optionen, mit denen du die composer.json-Datei deines Projekts definieren kannst.

Screenshot des Konfigurationsgenerators von Composer in Aktion.
Mit composer init eine Konfiguration erstellen

Beachte, dass der Assistent vordefinierte Antworten auf die Fragen gibt, z. B. dass dein Name und deine E-Mail-Adresse von Git abgeleitet werden. Du kannst sie gerne ändern, wenn du möchtest.

Diese Bibliothek ist in ihrer Funktionalität nicht von anderen Paketen abhängig, daher kannst du die Fragen nach Abhängigkeiten mit Nein beantworten.

Der Assistent zeigt dir eine Vorschau des generierten Dateiinhalts und bittet dich, ihn zu bestätigen, um den Assistenten abzuschließen.

Organisieren der Paketdateien

Wenn du den Assistenten abschließt, werden zusätzlich zur composer.json-Datei zwei Verzeichnisse erstellt:

  • src für deinen Quellcode
  • vendor für deine heruntergeladenen Abhängigkeiten

Verschiebe die Datei TemperatureConverter.php in das Verzeichnis src. Wenn deine Bibliothek Abhängigkeiten hat, führe composer install aus, um den Autoloader zu erzeugen und die Paketabhängigkeiten zu installieren.

Hochladen des Codes auf GitHub

Füge deine Änderungen und neuen Dateien zu Git hinzu:

$ git add -A

Commit die Änderungen im lokalen Repository und pushe sie in das Remote-Repository auf GitHub, damit du das Projekt im nächsten Abschnitt einfach veröffentlichen kannst:

$ git commit -am "Initial Release" && git push

Eine Release-Version für deine Bibliothek erstellen

Wenn du deinen Code in deinem Repository hast, kannst du eine Version deiner Bibliothek mit einer Versionsnummer erstellen, damit andere Entwickler deine stabilen und wichtigen Updates verfolgen können.

Navigiere zu deinem Repo auf GitHub und klicke unter dem Abschnitt About auf Releases. Auf der Seite Releases, auf der du im Moment vermutlich nichts hast, klickst du auf Create a new release.

Ein Screenshot der GutHub-Seite für Veröffentlichungen.
Die Releases-Seite von GitHub

Gib ein paar Details zu deiner Veröffentlichung an, z.B. die Tag-Version und den Titel der Veröffentlichung. Die Tag-Version sollte ein eindeutiger Bezeichner für diese Veröffentlichung sein (Beispiel: v1.0.0) und der Titel der Veröffentlichung sollte die Änderungen beschreiben, die in der Veröffentlichung enthalten sind (Beispiel: Initial release).

Optional kannst du auch eine Beschreibung der Version hinzufügen. Wenn du eine Datei hochladen möchtest, z. B. eine kompilierte Binärdatei oder ein Quellcode-Archiv, ziehe die Datei in den Bereich Binärdateien anhängen, indem du sie hier ablegst oder auswählst, aber das ist für diesen Lehrgang nicht nötig.

Screenshot der Details, die auf der GitHub-Seite für Veröffentlichungen eingegeben wurden.
Eingabe der ersten Veröffentlichungsdetails auf GitHub

Klicke auf Release veröffentlichen, um die Veröffentlichung zu erstellen.

Dein Projekt sollte jetzt auf der Seite Releases deines Repositorys verfügbar sein. Die Nutzer können alle angehängten Dateien herunterladen und die Versionshinweise einsehen. Wenn du außerdem ein Tag für die Veröffentlichung hinzugefügt hast, können andere Entwickler dieses Tag verwenden, um den genauen Code zu sehen, der in der Veröffentlichung enthalten ist.

Deine Bibliothek ist nun bereit, mit der Welt geteilt zu werden. Veröffentlichen wir sie als Paket auf Packagist.

Erste Schritte mit Packagist

Packagist ist das wichtigste Paket-Repository für PHP. Es ist ein zentraler Ort, an dem Entwickler ihre PHP-Pakete veröffentlichen und mit anderen teilen können, damit andere Entwickler diese Pakete entdecken und in ihren eigenen Projekten verwenden können. Lass uns dein Paket veröffentlichen!

Navigiere zur Packagist-Website, klicke auf Anmelden und wähle GitHub als Anmeldemethode, um dein GitHub-Konto zur Authentifizierung zu verwenden.

Screenshot der Packagist Autorisierungsseite über GitHub.
Anmeldung bei Packagist mit GitHub

Klicke auf Autorisieren, um Packagist die Erlaubnis zu geben, auf dein Konto zuzugreifen.

Screenshot eines Benutzers, der bei Packagist angemeldet ist.
Erfolgreiche Anmeldung bei Packagist mit GitHub

Einreichen deines Composer-Pakets auf Packagist

Um ein Paket auf Packagist zu veröffentlichen, reiche das GitHub-Repository mit der composer.json-Datei ein, die dein Paket und seine Abhängigkeiten beschreibt. Klicke auf der Packagist-Website auf Einreichen, gib auf der angezeigten Seite die URL deines Repos an und klicke auf Prüfen, um es zu validieren.

Wenn das Repository gültig ist, erkennt Packagist den Namen des Pakets und die Schaltfläche Überprüfen wird zu Übermitteln.

Screenshot der Composer-Paketdetails, die für die Übermittlung an Packagist bereit sind.
Das Composer-Paket rexfordnyrk/tempconv ist validiert und bereit zum Einreichen

Klicke auf Abschicken und Packagist nimmt sich einen Moment Zeit, um dein Projekt einzurichten und zu veröffentlichen.

Screenshot der Composer-Paketdetails nach der Veröffentlichung.
Das Composer-Paket wurde erfolgreich veröffentlicht

Das war’s! Dein Paket ist jetzt auf Packagist verfügbar und kann von anderen Entwicklern als Abhängigkeit in ihren eigenen Projekten verwendet werden.

Verwendung deines Composer-Pakets in anderen Projekten

Du kannst dein veröffentlichtes Paket in anderen Projekten verwenden, indem du es als Abhängigkeit in der Datei composer.json hinzufügst. Du kannst die Datei manuell erstellen und bearbeiten, aber es ist besser, den Composer-Befehl wie folgt zu verwenden:

$ composer require rexfordnyrk/tempconv

Composer erstellt die Datei composer.json automatisch, wenn sie noch nicht vorhanden ist, und findet, lädt und lädt das Paket automatisch von Packagist. Die Ausgabe sollte in etwa so aussehen:

Screenshot of the terminal after adding a library to a project with Composer.

Erstelle eine Datei demo.php, die den Code deiner Demo-Anwendung enthält, die mit deiner Bibliothek arbeitet.
Du kannst dann die Klasse TemperatureConverter in deinem Anwendungscode wie folgt verwenden:

<?php
use Rexfordnyrk\Tempconv\TemperatureConverter;

require_once './vendor/autoload.php';

$converter =  new TemperatureConverter();

$fahrenheit = $converter->convert(20, 'C');
echo "20°C is equivalent to $fahrenheit °F\n";

$celsius = $converter->convert(68, 'F');
echo "68°F is equivalent to $celsius °C\n";

Dieser Code verwendet die Klasse TemperatureConverter, um Temperaturen von 20 Celsius und 68 Fahrenheit umzurechnen und die Ergebnisse auszugeben. Die importierte Datei autoloader.php wurde vom Composer erstellt, um alle benötigten Abhängigkeiten zu laden. Sie sorgt dafür, dass die Klasse bei Bedarf automatisch geladen wird.

Führe diesen Code schließlich in deinem Terminal aus:

$ php demo.php

Du solltest eine ähnliche Ausgabe wie diese erhalten:

$ php demo.php
20°C is equivalent to 68 °F
68°F is equivalent to 20 °C

Zusammenfassung

Du hast soeben eine einfache PHP-Bibliothek erstellt, die die Temperatur von Celsius in Fahrenheit und umgekehrt in einer objektorientierten Klasse umwandelt, die in anderen Anwendungen wiederverwendet werden kann. Du hast gesehen, wie du mit Composer ein Paket aus der Klasse mit dem Befehl Composer Init erstellst, und du hast einige grundlegende Best Practices zur Codeorganisation für deine Bibliothek gelernt. Du hast deine Bibliothek auf Packagist veröffentlicht, damit du und andere Entwickler sie als Abhängigkeit in anderen Projekten verwenden können.

Wenn du mit der Entwicklung deiner Anwendung fertig bist, musst du sie natürlich auch hosten. Bringe deine PHP-Entwicklung auf die nächste Stufe mit dem Web Anwendungs-Hosting bei Kinsta. Du kannst deine Composer-basierte PHP-Anwendung in wenigen Minuten bereitstellen. Füge deine Anwendung einfach über das Git-Repository deines Projekts hinzu, und Kinsta kümmert sich um den Rest. Es erkennt die Composer-Datei automatisch und baut deine Anwendung automatisch. Lege noch heute risikofrei los!

Rexford Nyarko

Rexford Nyarko is a solution architect with a background in software and network systems, cloud environments, server administration, and various database technologies. Rexford particularly enjoys explaining technical concepts to non-technical audiences.