Livewire-Components mithilfe von Event-Listeners aktualisieren

Was ist Livewire: Stell dir vor, du könntest coole Single-Page-Apps zaubern, ganz ohne dich in externe JS-Frameworks wie Vue.js reinfuchsen zu müssen. Mit Laravel Livewire geht das! Das Ding ist ein Full-Stack-Framework, das wie Pech und Schwefel zu Laravel passt und dir hilft, flotte dynamische Benutzeroberflächen zu entwickeln, ohne dass du auf die Vorteile von Laravel verzichten musst.

Zum Feature: Schauen wir uns nun an, wie wir unser Component aktualisieren können, wenn Events auftreten, und zwar unter Verwendung des neuen #[On]-Attributs.

Ab Livewire Version 3.4.0 kannst du das #[On]-Attribut auf Klassenebene verwenden. In früheren Versionen konntest du dieses Attribut nur zu deinen Klassenmethoden hinzufügen. In Livewire Version 2 war es üblich, Listener hinzuzufügen, die deine Komponente aktualisieren würden, zum Beispiel:

class MonitorOverview extends Component
{
    protected $listeners = [
        'monitorDeleted' => 'refresh',
    ];
}

Wenn ein Monitor gelöscht wurde, würde dies sicherstellen, dass deine Übersicht aktualisiert wird und der entfernte Monitor nicht mehr aufgeführt ist. Mit der neuen Version ist dies noch einfacher geworden. Jetzt können wir das #[On(`monitorDeleted`)]-Attribut verwenden, um das gleiche Ergebnis zu erzielen.

class MonitorOverview extends Component
{
    #[On('monitorDeleted')]
    public function refresh() {}
}

Hey, hast du schon gehört, dass du jetzt in PHP Attribute definieren kannst? Das geht seit PHP 8 und ist echt eine coole Sache. Falls du Bock hast, mehr darüber zu lernen, check mal diesen Artikel aus. Der erklärt’s dir von A bis Z!

Aufteilung eines großen Laravel Livewire Components – Teil 1

In diesem Blogbeitrag erfährst du, wie du Livewire-Komponenten effektiv aufteilst, Views und Validierungsregeln strukturierst und Sub-Komponenten wiederverwendest. Optimiere deine Livewire-Entwicklung mit bewährten Best Practices. Bleib dran!

Manchmal, egal welche Lösung du zur Entwicklung deines Systems verwendest, kommt der Punkt, an dem alles etwas zu groß wird und unübersichtlich zu werden droht. Zum Glück bietet Livewire eine Lösung für dieses Problem.

Was ist Livewire?

Laravel Livewire bietet eine Möglichkeit, dynamische Benutzeroberflächen zu erstellen. Anstatt einer JavaScript-Bibliothek wie Vue oder React erlaubt es Entwicklern, ihren Code in PHP-Komponenten und Blade-Templates zu schreiben. Es ist fantastisch. Ich nutze es bereits im vielen Projekten. Wenn du es noch nicht ausprobiert hast, empfehle ich dir, es einmal anzuschauen.

Was ist das Problem?

Oftmals beinhalten Tutorials und Beispiele nur den Aufbau kleiner Komponenten, wie z.B. eines Kontaktformulars oder einer To-Do-Liste. Das ist vollkommen in Ordnung, da es ermöglicht, den Aufbau von Anfang bis Ende zu zeigen. Doch in einem Projekt aus dem wahren Leben hat man oft mit großen und sehr komplexen Systemen zu tun und erhalten hier dann kundenspezifische Anforderungen die umgesetzt werden sollen.

Nehmen wir als Beispiel eine Website zur Buchung von Mietwagen für den Urlaub. Bei der Buchung müssen Kundendetails wie Name und Adresse, der gewünschte Fahrzeugtyp sowie Extras wie zusätzliche Versicherungen oder sogar Hotelreservierungen erfasst werden.

Eine Herangehensweise wäre die Erstellung einer einzigen großen Komponente mit der gesamten Logik und einer einzelnen Ansichtsdatei, die immer länger wird. Das funktioniert wahrscheinlich gut, aber es gibt Tools, mit denen man diese Aufgabe in überschaubare Abschnitte aufteilen kann.

Die Aufteilung der Komponentenklasse mit Traits

Livewire v2 bietet eine großartige Funktion von PHP namens Traits, mit der man eine Datei erstellen kann, die innerhalb einer Klasse verwendet wird und der Klasse die Methoden und Eigenschaften des Traits zur Verfügung stellt. Dadurch kann man die Logik auf mehrere kleinere und besser handhabbare Dateien aufteilen und sie in der Hauptkomponente wiederverwenden.

Wenn wir zu unserem Beispiel der Mietwagenbuchung zurückkehren, benötigen wir möglicherweise ein Trait, das unsere Methoden zum Abrufen von Fahrzeugdaten enthält, ein weiteres Trait für Standortinformationen wie Adressen oder ein Trait zur Speicherung der Kundendetails.

Aber Livewire-Traits gehen sogar noch weiter.

Neben der Definition eigener Methoden können wir auch eine Namenskonvention verwenden, um uns in die Livewire-Lifecycle-Hooks einzuklinken. Wir haben gesagt, dass wir ein Trait erstellen werden, das sich auf Fahrzeuginformationen konzentriert, aber wie machen wir diese Daten für den Rest der Komponente verfügbar? Wir könnten eine Methode aus der mount-Methode der Hauptkomponentenklasse aufrufen, aber wir könnten dies auch im Trait selbst tun, indem wir die mount-Methode des Traits verwenden.

Wenn unser Trait „VehicleInformation“ heißt, können wir eine Methode „mountVehicleInformation“ in unserem Trait erstellen, in der wir die Fahrzeugdaten einer öffentlichen Variable zuweisen. Dadurch stehen sie der Hauptkomponente zur Verfügung.

Aus dem obigen Beispiel können wir sowohl in der Hauptkomponentenklasse mit $this->vehicles als auch in der Blade-View mit $vehicles auf die Fahrzeugdaten zugreifen.

Eine weitere Herausforderung bei der Entwicklung großer Livewire-Komponenten besteht darin, die Views und Validierungsregeln zu verwalten. Um die Code-Wartbarkeit und die Wiederverwendbarkeit zu verbessern, können wir auch hier auf die Aufteilung setzen.

Zusätzlich können wir Sub-Komponenten erstellen, um bestimmte Funktionen oder Abschnitte unserer Hauptkomponente zu modularisieren.

In meinem nächsten Beitrag werde ich detailliert darauf eingehen, wie wir dies auch erreichen können. Sobald dieser Beitrag fertig ist, werde ich hier einen Link bereitstellen, damit ihr ihn lesen könnt.

Bleibt gespannt und freut euch auf weitere Tipps und Tricks zum effizienten Entwickeln mit Livewire!

Laravel Livewire – From Scratch

Livewire ist mittlerweile zu einem sehr populären Tool geworden, wenn es darum geht eine Laravel Anwendung zu programmieren. Livewire unterstützt vor allem die typischen Backendentwickler darin, UI/UX für den Anwender deutlich zu bessern, ohne dabei auf typische Merkmale von Laravel zu verzichten.

Wer Livewire noch nie verwendet hat, sollte dies schnell mal ändern. Die Dokumentation ist sehr umfangreich und Livewire bietet sogar selbst einige Screencasts, um schneller die Verwendung zu verstehen.

Wer aber mal genau wissen möchte, was Livewire alles im Hintergrund macht und was eigentlich alles zu beachten ist, der schaut sich am besten mal eines der neusten Laracasts Videos von Caleb Porzio (@calebporzio) an. Hier wird in mehreren Videos eine minimal Version von Livewire nachgebaut.

Hier der Link: https://laracasts.com/series/livewire-uncovered

Verschlüsselung der .env Datei

In modernen Anwendungen wie z.B. Laravel, werden häufig „.env“ Dateien verwendet, um Zugangsdaten für die Datenbanken, API-Token oder andere Zugangsschlüssel zu speichern (siehe https://dotenv.org/). Dies hat den Vorteil, dass diese nicht im Quellcode der Anwendung hinterlegt werden müssen und so an einer zentralen Stelle gespeichert werden. Außerdem kommen sie so nicht in die Versionskontrolle wo sie ggf. von Personen außerhalb des Projektes gelesen werden könnten.

Sobald ein neuer Wert in dieser Datei hinterlegt wird, muss dieser auch bei allen Entwickler im Team hinterlegt werden oder in die produktive Umgebung eingespielt werden. Gerade wenn es hierfür keinen richtigen Prozess gibt, wie die Zugangsdaten dann verteilt werden, könnte dies wieder unsicher übertragen werden. Vielleicht wird hier eine Rundmail geschrieben oder mit einer Message via Slack, Teams oder gar in WhatsApp verschickt. Und sollten sich die Werte auch nicht in Produktion automatisch oder per Deployment aktualisieren, dann muss hier auch immer händisch noch der richtige Wert hinterlegt werden.

Eine Lösung hierfür kommt von Dotenv selbst und bietet eine Synchronisierung. Doch wer Kosten sparen möchte oder eine Cloud Lösung nicht in Frage kommt, der steht wieder vor dem Ausgangsproblem.

Darum habe ich ein kleines Package gebaut, mit dem man die .env Datei sicher im Repository hinterlegen kann, ohne das es hier zu Bedenken der Sicherheit kommt. Mit dem Package lässt sich die lokale .env Datei sicher verschlüsseln und damit auch in das Repository einchecken. Andere Personen im Team können diese dann auschecken und dann wieder entschlüsseln. Das gleiche geht auch für die produktive Umgebung. So muss nur noch der geheime Schlüssel bekannt sein, welcher nur für ausgewählte Personen im Team bekannt ist.

Das Package findest du wie immer bei GitHub. Es befindet sich noch in der aller ersten Version: https://github.com/TobyMaxham/laravel-envcrypter

Wechsel zu MySQL wegen PHP MSSQL – Verbindungsproblem

In der Zhylon Cloud haben wir historisch einen MSSQL Server für die Abarbeitung der Jobs in einer Queue im Einsatz. Leider hatten wir in der Vergangenheit immer wieder Probleme beim Einsatz des SQL Servers von Microsoft. So auch der folgende Fehler, der einen Teil der Anwendung am vergangenen Wochenende lahm gelegt hat.

Nach einer Routinewartung hatten wir plötzlich Probleme, das die Anwendung sich mit dem Server Verbinden konnte. Wir haben hier, wie fast überall, Laravel 9 in der Standardkonfiguration im Einsatz und haben dann folgenden Fehler erhalten:

Fatal error: Cannot connect to server: 192.168.1.95\ZHYLONBD,3306 : SQLSTATE: 08001
code: 10054
message: [Microsoft][ODBC Driver 17 for SQL Server] TCP Provider: Error code 0x2746
SQLSTATE: 08001
code: 10054
message: [Microsoft][ODBC Driver 17 for SQL Server] Client unable to establish connection in DbConnector.php on line 110

Eine Lösung dafür haben wir schnell gefunden und wird von yitam auf GitHub im Repository vom microsoft/msphpsql beschrieben. Das Problem war wohl, das Versäumnis auf eine neuere Version des SQL Servers umzusteigen. Ein paar Tests mit Docker und dem SQL Server 2017 und 2019 waren erfolgreich und hatten keine Probleme. Allerdings hatten wir nicht geplant hier ein Upgrade auszuführen, da hiermit auch deutlich höher Kosten entstehen würden und wir sehr kritisch und auch unzufrieden mit dem SQL Server sind.

Wir haben uns daher kurzerhand dazu entschieden, die alte MSSQL Datenbank durch eine MySQL Datenbank zu ersetzen. Dies ging tatsächlich relativ schnell und es waren kaum Anpassungen notwendig. Ein paar Migrations mussten angepasst werden, da die Syntax nicht kompatibel war. Außerdem mussten wir für eine relativ alte Datenbank einmal alle Migrationen „rückwärts“ erstellen, da es hierfür keine Migrations gab. Wir haben hierfür das Package Xethron/migrations-generator verwendet, welches zwar nicht länger aktualisiert wird, es für diese einmalige Nutzung aber völlig ausreichend war.

Als Review zu dem Thema haben wir uns nun festgelegt, dass wir in den nächsten Monaten noch die ein oder andere ältere Struktur ablösen und modernisieren werden. Außerdem haben wir einen Prozess angestoßen, der zukünftig dafür sorgen soll, dass Updates und Upgrades zeitnah ausgeführt werden.