Was ist Composer?
Composer ist ein Manager für Abhängigkeiten. Übersetzt aus dem Englischen wo es Dependency Manager heisst.
Doch was heisst das genau?
Angenommen ich starte ein neues Projekt. From Scratch sozusagen. Das neue Projekt heisst „LogMe“ und nimmt per HTTP GET Informationen entgegen. Diese sollen dann geloggt werden.
Jetzt könnte ich den Logger selbst schreiben oder mir im Internet irgendwo eine Library runterladen und diese dann irgendwie einbinden. Das Problem bei der Vorgehensweise ist, dass die eine Library so eingebunden werden muss und eine andere dann wieder anders.
Mit diesem Problem räumt Composer endgültig auf.
Ich kann über Composer Abhängigkeiten runterladen und diese dann per Autoload einbinden. Das schöne daran ist, dass die Composer Konfigurationsdatei composer.json später auch für andere Zwecke verwendet werden kann. Schließlich benötigt man Logging Funktionen auch in anderen Anwendungen.
Doch am besten kann ich das mit einer Beispiel Anwendung zeigen.
Beispiel Anwendung mit Composer Einsatz
Die Beispiel Anwendung „LogMe“ kann nicht viel. Sie nimmt Anfragen per HTTP GET entgegen und loggt diese dann. Ich brauche also etwas das die Anfragen entgegen nimmt und etwas das dann das Logging übernimmt.
Als erstes schaue ich auf Packagist welche Bibliotheken ich für „LogMe“ benutzen möchte.
Für die Rest Anfragen habe ich Respect/Rest herausgesucht. Für das Logging habe ich mich für Monolog entschieden.
Nachdem jetzt die Abhängigkeiten klar sind, erstelle ich das Projektverzeichnis:
mkdir logme
cd logme
Und installiere die Abhängigkeiten:
composer require respect/rest
composer require monolog/monolog
Bei der Installation gibt es einige Ausgaben. Ich bekomme vom Composer noch ein paar Hinweise zu Monolog und welche zusätzlichen Abhängigkeiten interessant sein könnten. Diese sind aber nicht notwendig.
Nach der Installation sind im Projektverzeichnis zwei neue Dateien und ein Verzeichnis.
composer.json
composer.lock
vendor
Die composer.lock Datei ist sehr wichtig und sollte bei Bedarf auch in die Versionskontrolle wie Git. Hier stehen zum Beispiel Informationen zur aktuellen Version der einzelnen Abhängigkeiten. Fehlt diese composer.lock Datei, wird unter Umständen beim composer install
die falsche Version herangezogen. Weitere Informationen zu dieser Datei gibt es hier.
Die composer.json enthält alle Anweisungen, die ich mit den zwei Befehlen hinzugefügt habe.
{
"require": {
"respect/rest": "^0.6.0",
"monolog/monolog": "^1.24"
}
}
Ich hätte auch erst die composer.json erstellen können und dann mit composer install
alles installieren können.
Im vendor Verzeichnis finde ich jetzt einige Unterordner. psr ist eine Abhängigkeit von monolog und wurde daher gleich selbstständig installiert.
Nachdem die Abhängigkeiten jetzt klar sind, erstelle ich die index.php.
Zur Entwicklung benutze ich sowohl PHPStorm, als auch Visual Studio Code. Visual Studio Code ist ein kostenloser Editor speziell für Webanwendungen. PHPStorm ist auf die Entwicklung von PHP abgestimmt.
Du kannst natürlich auch jeden anderen Editor benutzen.
Ich öffne also die index.php in Visual Studio Code:
code index.php
Zuerst erstelle ich hier eine Instanz des Respect Rest Routers mit:
<?php
use Respect\Rest\Router;
$router = new Router;
Auf der Konsole im Projektverzeichnis starte ich den in PHP eingebauten Webserver. Für unsere Zwecke reicht das jetzt vollkommen und wir brauchen keinen Apache / Nginx für diese kleine Übung.
Den Built-In Webserver von PHP starte ich mit:
php -S localhost:8000
Erscheint eine Fehlermeldung, dann könnte der Port 8000 belegt sein. Versuche dann einfach 8001 oder höher.
Im Browser rufe ich jetzt die Seite mit http://localhost:8000 auf:
Uncaught Error: Class 'Respect\Rest\Router' not found in ...index.php on line X
Oha. Welch eine Ernüchterung. Die Seite funktioniert nicht und auf der Konsole kommt der oben stehende Fehler.
Doch wo liegt hier der Fehler?
Ich muss noch den Composer Autoload integrieren.
<?php
use Respect\Rest\Router;
require_once __DIR__ . '/vendor/autoload.php';
$router = new Router;
Wenn ich jetzt wieder http://localhost:8000 aufrufe erscheint eine 404 Fehlermeldung. Das ist aber klar, weil wir ja noch keine Route angelegt haben. Zeit also den Rest des Routings zu implementieren.
$router->get('/log/*', function($message) {
return $message;
}
);
Wenn ich jetzt http://localhost:8000/log/istdochegal aufrufe, wird dieser Text im Browser angezeigt. Perfekt!
Der erste Teil meiner Beispiel Anwendung funktioniert. Die Anwendung nimmt einen Aufruf entgegen und „loggt“ jetzt.
Also bringe ich jetzt noch Monolog ins Spiel:
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
...
$router->get('/log/*', function($message) {
$logger = new Logger('logme_logger');
$logger->pushHandler(new StreamHandler(
__DIR__.'/application.log',
Logger::DEBUG));
$logger->addInfo($message);
}
);
Jetzt testen wir mal den Logger mit http://localhost:8000/log/dasisteintest
Die Ausgabe im application.log sieht folgendermaßen aus:
[2019-01-26 13:05:10] logme_logger.INFO: dasisteintest [] []
Das war es auch schon mit meiner kleinen Beispiel Anwendung. Hier noch mal die komplette index.php.
<?php
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Respect\Rest\Router;
require_once __DIR__ . '/vendor/autoload.php';
$router = new Router;
$router->get('/log/*', function($message) {
$logger = new Logger('logme_logger');
$logger->pushHandler(new StreamHandler(
__DIR__.'/application.log',
Logger::DEBUG));
$logger->addInfo($message);
}
);
Vorteile von Composer
- Paketmanager
- Bibliotheken einfach ins Projekt integrieren
- Abhängigkeiten automatisch auflösen
- Einfache Weitergabe von Projekten
Fazit zu Composer
Innerhalb von wenigen Minuten habe ich einen kleinen Prototypen entwickelt. Geholfen haben mir dabei zwei Abhängigkeiten oder Bibliotheken, die ich ganz einfach mit Composer zu meinem Projekt hinzugefügt habe. Über den Composer Autoloader habe ich diese Abhängigkeiten dann eingebunden.
Wenn du dir mal anschauen willst wie ein Projekt mit Composer und Laravel entsteht, dann empfehle ich dir das Laravel Anfänger Tutorial für den einfachen Einstieg.
Pingback: Laravel Anfänger Tutorial für den einfachen Einstieg
Hi Dirk,
macht Spaß Deine Beispiele durch zu arbeiten 😉
Atom wird nun den altgedienten Bluefish ablösen. Der war mir jahrelang treu….
So langsam kann ich mich für Larval begeisten. Hab es vor drei Jahren schon einmal erfolglos versucht….
Schöne Feiertage,
ToM
Hi ToM,
freut mich wirklich.
Laravel ist wirklich genial. Demnächst werde ich hier noch WordPress gegen etwas eigenes ablösen. Mir gehen die Spam Kommentare total auf den Sack. Selbst mit AntispamBee für WordPress gibt es mittlerweile Spam Kommentare ohne Ende. Ich bin ständig damit beschäftigt Kommentare zu löschen. Mit einer eigenen Lösung wird es dann besser und ich habe auch mehr Zeit für die wichtigen Dinge.
Viele Grüße
Dirk
natürlich meinte ich „Laravel“. Ich freu mich auf weitere Beispiele….