Eine einfache API-Dienstanwendung zum Konsumieren von Gutscheinen aus dem Pool. Dies dient Demozwecken und wurde erstellt, um Architektur- und Programmierkenntnisse zu demonstrieren.
Nachfolgend finden Sie die wichtigsten Designpunkte und wie sie gehandhabt und implementiert wurden.
Composer wird verwendet, um alle Abhängigkeiten der Anwendung zu verwalten. Alle erforderlichen Pakete/Bibliotheken werden in der Datei composer.json
deklariert. Und kann mit dem composer install
installiert werden.
Der Anwendungseintrag verweist auf public
Verzeichnis, das nur die Datei index.php
enthält und auch Asset-Dateien enthalten kann, auf die öffentlich zugegriffen werden kann. Ansonsten kann auf keinen Code oder keine Datei außerhalb dieses Ordners direkt zugegriffen werden. Die Idee besteht darin, alle Dateien außerhalb dieses Verzeichnisses zu schützen.
Alle Anfragen und wie sie behandelt werden müssen, sind in der routes/api.php
definiert.
Für die Interaktion mit mySQL haben wir die Illuminate-Datenbank, auch bekannt als „Eloquent“, verwendet. Es ermöglicht uns die Interaktion mit unserer Datenbank über Object Relational Mapping „ORM“.
Für die Migration und das Seeding der Datenbank haben wir das Framework-unabhängige Paket Phinx verwendet. Im Laufe der Zeit entwickelt sich der Anwendungscode weiter und mit ihm entwickelt sich auch die Datenbank weiter. Um den Überblick über die Codeänderungen zu behalten, verwenden wir Tools zur Quellversionierung wie Git. Mit den Migrationsskripten können wir auch den Überblick über die Datenbankänderungen behalten. Besonders hilfreich bei der Arbeit in einer Teamumgebung. Wenn Teamkollegen Ihre Änderungen abrufen und die Migrationsskripts sehen, können sie diese einfach mit dem einfachen Befehl ausführen, um die Schemaänderungen ihrer lokalen Datenbank zu aktualisieren.
Für die Verwaltung von Klassenabhängigkeiten und die Durchführung der Abhängigkeitsinjektion haben wir SlimFramwork Container
verwendet. Damit können wir die Kontrolle der Abhängigkeiten von der Anwendung zur Klasse umkehren, daher das Muster „Inversion of Control“.
Für die Handhabung der Konfigurationseinstellungen für die Anwendung haben wir Illuminate Config verwendet. Alle Konfigurationen werden im config
gespeichert. Außerdem wurde Symfony Dotenv verwendet, um die in .env
Datei definierten Variablen zu laden und dann über die Funktion getenv() darauf zuzugreifen. Dies ist nützlich, um für jede Umgebung unterschiedliche Konfigurationseinstellungen zu haben, z. B. Entwicklung, Staging, Produktion.
Um zu verstehen, was in unserer Anwendung passiert, haben wir die Monolog-Bibliothek verwendet, die robuste Protokollierungsdienste bereitstellt, mit denen Sie Nachrichten protokollieren können.
Um die eingehenden HTTP-Anforderungsdaten Ihrer Anwendung zu validieren, haben wir Illuminate Validation verwendet, das eine Vielzahl leistungsstarker Validierungsregeln bereitstellt.
Um eine standardmäßige und konsistente Ausgabe von API-Antwortdaten bereitzustellen, haben wir League Fractal verwendet, sodass wir eine Präsentations- und Transformationsebene für unsere Ausgabedaten haben können. Alle Transformationsklassen werden im Verzeichnis app/Transformers
gespeichert.
Wenn ein neues Sonderangebot erstellt wird, generieren wir nicht für alle Empfänger in unserem System Gutscheine. Stattdessen verwenden wir HashIds, um Gutscheine für jeden Empfänger zu generieren und zu validieren. Wir können kodieren und dekodieren, indem wir eine Kombination aus [{recipient_id}, {offer_id}]
verwenden. Es wird immer ein Gutscheincode mit genau 8 Zeichen erstellt, der auch in der config/hashids.php
aktualisiert werden kann
Um unseren Anwendungsdienst zu testen, haben wir Codeception verwendet. Damit können wir sofort alle drei Arten von Tests durchführen, d. h. Unit-, Funktions- und Akzeptanztests, in einem einheitlichen Framework. In unserem Fall haben wir die Kerngeschäftsobjekte in AppServices
Unit-Tests unterzogen und außerdem Abnahmetests geschrieben, um die Integration und Funktionalität aller API-Endpunkte zu überprüfen. Alle Testfälle werden im tests
gespeichert. und kann mit dem folgenden Befehl ausgeführt werden:
$ php vendor/bin/codecept run --steps
Um die Codierungsstandards im gesamten Team aufrechtzuerhalten, habe ich die Datei phpcs.xml
erstellt, in der alle Codierungsstandards definiert sind. und alle Codedateien können anhand dieser Datei überprüft werden, indem Sie den folgenden Befehl ausführen:
$ php vendor/bin/phpcs
Anforderungen an die Entwicklungsumgebung:
Einrichten Ihrer Entwicklungsumgebung auf Ihrem lokalen Computer mithilfe eines Setup-Skripts (für MAC/LINUX) :
git clone https://github.com/ahsanatiq/voucher-pool-api.git
cd voucher-pool-api
./setup.sh
Manuelle Einrichtung (für Windows) :
git clone https://github.com/ahsanatiq/voucher-pool-api.git
cd voucher-pool-api
cp .env.dev .env
docker-compose up -d
docker exec -it voucher-pool-php-fpm composer install
docker exec -it voucher-pool-mysql mysql -u root -pnewsletter2go -e " create database newsletter2go_testing; GRANT ALL PRIVILEGES ON *.* TO 'newsletter2go'@'%' IDENTIFIED BY 'newsletter2go'; " ;
docker exec -it voucher-pool-php-fpm php vendor/bin/phinx migrate
docker exec -it voucher-pool-php-fpm php vendor/bin/phinx seed:run
Nun können Sie über http://localhost:8080 auf die Anwendung zugreifen.
Führen Sie die Unit-Tests und Akzeptanztests im PHP-FPM-Dienstcontainer aus:
docker exec -it voucher-pool-php-fpm php vendor/bin/codecept run --steps
Sie können auf die öffentliche API-Dokumentation bei Postman zugreifen. Um alle APIs zu importieren und auszuführen, klicken Sie in der oberen Leiste auf „In Postman ausführen“. Nach der Installation und dem Import wird die neue Sammlung als „Newsletter2Go – Gutschein-API“ angezeigt.