#32: Laravel

Shownotes

Während Kay bei sommerlichen Temperaturen zum kühlen Drink greift, bleibt Felix eisern beim Tee. Im Webcafé dreht sich diesmal alles um Laravel – unser Lieblings-Backend-Framework, das uns seit Jahren zuverlässig begleitet. Wir zeichnen nach, wie wir dort gelandet sind, wo Laravel glänzt und wo es knirscht, sprechen über pragmatische Deployments, sinnvolle Pakete, Laravel-Alternativen und zeigen, wie Queues den Server entlasten und welche Frontends sauber mit Laravel zusammenspielen. Wie immer keine Enzyklopädie, sondern gelebte Praxis gespickt mit Anekdoten.

Transkript anzeigen

00:00:00: Hallo Felix. Hallo lieber Kay.

00:00:06: Ich dachte, ich überfalle dich heute mal direkt.

00:00:08: Schön, dass du dir die Zeit genommen hast,

00:00:10: bei so sommerlichen Temperaturen hier mit mir in unserem Café zu sitzen.

00:00:14: Ich weiß nicht, wie warm ist es bei dir?

00:00:16: Ich habe einen Thermometer hier direkt vor mir stehen in meinem Homeoffice

00:00:18: und es ist kühler geworden, weil es ein bisschen bewölkt geworden ist.

00:00:22: Aber 28,3 Grad habe ich noch.

00:00:24: Hochsommer und nichtsdestotrotz nehmen wir eine neue Folge auf.

00:00:28: Ich nehme an, zu so heißen Temperaturen hast du jetzt nicht auch noch ein heißes Getränk vor dir?

00:00:33: Ja, ich habe lange gegrübelt, aber ich habe doch einen richtig konventionellen Tee mitgebracht.

00:00:39: Einen warmen?

00:00:40: Ja, genau.

00:00:41: Oh, schreck.

00:00:42: Von dem muss ich auf jeden Fall auch ein Foto hier in die Kapitelmarke einfügen,

00:00:47: weil der nämlich wirklich ein bisschen anders ist.

00:00:49: Ich habe über so ein paar Ecken von Bekannten, die kennen Ukrainer,

00:00:54: und die haben einen Tee aus den ukrainischen Karpaten mitgebracht.

00:00:57: Ich wusste gar nicht, dass die Karpaten, das ist ja so eine Gebirgskette,

00:01:01: dass sie sich ein bisschen in die Ukraine ziehen.

00:01:03: Ich hatte die eher so in Rumänien, also ein bisschen südlicher verortet.

00:01:05: Da sind die auch.

00:01:06: Aber die gehen eben auch ein bisschen in die Ukraine.

00:01:08: Und da gibt es wohl Waldbeeren.

00:01:10: Und die sind jetzt in meiner Tasse frisch aufgebrüht.

00:01:13: Und wie gesagt, ich habe euch ein Foto gemacht für alle Hörenden da draußen,

00:01:17: dass ihr euch das mal eben angucken könnt, wie das aussieht.

00:01:19: Und ich habe sogar Chachipiti mal gefragt, weil ich wusste ja gar nicht, was das für ein Tee ist.

00:01:22: Ich habe den einfach aufgebrüht, habe dann gemerkt, ah, der ist fruchtig.

00:01:25: Aber ich wusste nicht, was es ist.

00:01:27: Und Chachipiti.

00:01:27: Und ich habe mir dann erst gesagt, dass es so ein Karpatentee ist.

00:01:29: Also da sind nur, ja, diese, ich sage mal, russischen Buchstaben drauf.

00:01:33: Wie nennt man die nochmal?

00:01:34: Kyrillisch?

00:01:35: Genau, kyrillische Buchstaben sind da nur drauf.

00:01:37: Und Chachipiti liest das jedes Mal ein bisschen anders vor.

00:01:39: Aber ich spiele es mal gerade hier ins Mikrofon ab vom Handy.

00:01:41: Gebt mir eine Sekunde.

00:01:44: Hat man das verstanden?

00:01:45: Ja, also ich habe zumindest was gehört.

00:01:47: Verstanden habe ich es jetzt nicht direkt.

00:01:49: Also das soll der Name von dem Tee sein.

00:01:52: Soll Karpatentee heißen mit Waldbeeren.

00:01:55: Ob die Waldbeeren da jetzt drin sind in der Sprachausgabe.

00:01:57: Jeweils.

00:01:57: Weiß ich nicht.

00:01:58: Aber jedenfalls habe ich den hier vor mir.

00:02:00: Und der ist wirklich sehr lecker.

00:02:02: Also sehr lecker.

00:02:03: Waldbeerentee.

00:02:04: Also seitdem ich hören kann, höre ich ja die Geschichte,

00:02:07: dass angeblich heiße Getränke im Sommer abkühlen.

00:02:10: Ich glaube das bis heute nicht.

00:02:12: Hilft es bei dir eher?

00:02:13: Oder stehen jetzt schon die Schweißtropfen auf der Stirn?

00:02:17: Nö, auf keinen Fall.

00:02:18: Ich habe die Geschichte auch schon öfter gehört.

00:02:19: Aber ich schwitze mir dann immer einen ab.

00:02:22: Aber lecker ist er trotzdem.

00:02:23: Das ist die Hauptsache.

00:02:24: Und er trägt dich jetzt hoffentlich auch über diese aufregende,

00:02:26: aufregende Folge.

00:02:28: Ja, ist eine ganz wichtige Folge, Kay.

00:02:29: Ja, ich erzähle erst noch, dass ich in Amsterdam war.

00:02:33: Und da bei der Five Ways Rösterei

00:02:35: den Moves Life Jagger Espresso Röstung geholt habe.

00:02:40: Ich weiß nicht, ob ich davon schon erzählt habe.

00:02:41: Ach, bist du wieder bei Kaffee?

00:02:43: Ja, ja, ja.

00:02:44: Also leckeren Espresso.

00:02:45: Und hier wird beschrieben, die Tasting Notes sind

00:02:47: Chocolate, Nutella, Sweet und Balanced Acidity.

00:02:52: Und weil ich natürlich nicht so verrückt bin wie du,

00:02:54: habe ich mir das Ganze in einem Eiskaffee zusammengestellt.

00:02:56: Zusammen gepanscht mit Milch und einem bisschen Vanilleeis.

00:03:01: Und jetzt kann ich da lecker dran schlürfen.

00:03:04: Und das hält mich nämlich kühl.

00:03:05: Kühle Getränke.

00:03:06: Was ist mit euch Menschen?

00:03:07: Ah, herrlich.

00:03:08: Das hört sich sehr gut an.

00:03:09: Ich bin noch ein bisschen neidisch.

00:03:11: Aber ich freue mich mal über meinen Bären-Tee.

00:03:15: Kay, jetzt muss ein Wahnsinns-Intro kommen

00:03:16: für die aktuelle Folge,

00:03:18: weil das wird einer der wichtigsten sein,

00:03:19: die wir bisher gemacht haben.

00:03:20: Oh je.

00:03:21: Ja, du hast ganz aufgeregt

00:03:23: und mit den Hufenscharren vor mir gestanden.

00:03:25: In meinem Kopf zumindest.

00:03:26: Und hast mir erzählt,

00:03:27: Kay, wir müssen eine Laravel-Folge machen.

00:03:31: Und weil das ja so ein bisschen

00:03:32: eine der Kernkompetenzen unserer Unternehmung ist,

00:03:36: bin ich da natürlich Feuer und Flamme.

00:03:37: Aber warum ist das jetzt auf einmal so wichtig, Felix?

00:03:40: Ja, wir machen ja wirklich vor allem zwei Sachen.

00:03:44: Oder zwei Sachen wollen wir am allerliebsten machen.

00:03:46: Und das sind PHP, Laravel im Backend.

00:03:48: Da haben wir nämlich schon das Stichwort Laravel.

00:03:50: Und im Frontend ist das dann ja so TypeScript React.

00:03:53: Und dazu kommen natürlich dann so ein bisschen Shopware,

00:03:55: WordPress-Sachen und so.

00:03:56: Aber so dieses richtige Programmieren,

00:03:58: das sind eben diese beiden Themen.

00:04:00: Und wir haben zu React und TypeScript

00:04:01: ja schon ein bisschen was gemacht.

00:04:02: Aber wir haben noch nie irgendwo so richtig

00:04:04: was über Laravel erzählt.

00:04:07: Und das ist natürlich eine Katastrophe.

00:04:08: Weil ich bewerte mich natürlich hin und wieder auch auf Projekte.

00:04:11: Und da können wir vielleicht sogar eine eigene Folge

00:04:12: nochmal zu machen.

00:04:13: Haben wir, glaube ich, in unserem Backlog auch schon drin,

00:04:16: dass wir mal erzählen, wie das so in letzter Zeit bei uns lief

00:04:18: und mit Projektakquise und aktuelle Marktsituationen und so weiter.

00:04:21: Jedenfalls konnte ich jetzt in letzter Zeit

00:04:23: coole Projekte akquirieren.

00:04:25: Und das waren fast ausschließlich Laravel-Projekte.

00:04:28: Zu unserer Freude, weil das lange Zeit

00:04:31: ja irgendwie nicht so viel nachgefragt war,

00:04:33: hatte ich zumindest das Gefühl.

00:04:35: Und ja, gerade deshalb würde ich natürlich jetzt gerne

00:04:37: auch mal eine Laravel-Folge machen,

00:04:39: so dass wir den Leuten da draußen auch zeigen können,

00:04:41: wir haben tatsächlich schon mal was von Laravel gehört.

00:04:43: Und vielleicht kann ich es auch referenzieren,

00:04:45: wenn ich mich das nächste Mal irgendwo bewerbe.

00:04:47: Ich bin gespannt.

00:04:48: Da müssen wir uns jetzt richtig gut benehmen

00:04:49: und mit Kompetenz protzen.

00:04:52: Ja, die hoffe ich ja,

00:04:54: dass die bei dir,

00:04:55: die überbordend vorhanden ist.

00:04:58: Ich bin ja tatsächlich jetzt zuletzt

00:05:00: auch wieder ein bisschen in Laravel eingestiegen

00:05:01: und habe auch wieder was gemacht.

00:05:03: Habe aber vor allem so um 2019, 2020 rum

00:05:06: sehr, sehr intensiv mit Laravel gearbeitet.

00:05:08: Aber seitdem hat sich natürlich auch einiges getan.

00:05:10: Wir haben ja schon eine Folge über PHP gemacht,

00:05:13: wenn ich mich nicht ganz schlimm täusche,

00:05:14: wo wir, glaube ich, gut skizziert haben,

00:05:17: warum PHP für uns so ein starkes Tool ist

00:05:19: und wir das so gerne einsetzen.

00:05:21: Und jetzt ist eben die Frage,

00:05:23: warum konkret Laravel?

00:05:24: Warum ist Laravel so wichtig?

00:05:25: Ich glaube, das früheste Projekt,

00:05:27: an das ich mich erinnern kann,

00:05:28: das müsste 2017 gewesen sein.

00:05:30: Also jetzt fast schon zehn Jahre,

00:05:33: dass wir tatsächlich,

00:05:34: also sehr aufgerundet zehn Jahre,

00:05:36: dass wir Laravel bei uns einsetzen.

00:05:39: Jetzt mit großem Erfolg.

00:05:40: Weißt du noch, wie wir damals drauf gekommen sind?

00:05:42: Ich kann mich nicht erinnern, ehrlich gesagt.

00:05:43: Ich glaube tatsächlich,

00:05:45: dass wir Laravel sogar schon noch einen Tick länger einsetzen,

00:05:48: als du jetzt gesagt hast.

00:05:49: Ich habe nämlich im Kopf,

00:05:51: dass wir mit Laravel 4 auf jeden Fall eingestiegen sind.

00:05:54: Und ich habe natürlich,

00:05:55: eine kleine Historie vorbereitet.

00:05:56: Und Laravel 4 ist im Mai 2013 rausgekommen.

00:06:00: Die haben so das erste Mal dann so Composer eingeführt

00:06:02: und dieses paketbasierte System.

00:06:05: Und Laravel 5 ist dann im Februar 2015 gekommen.

00:06:08: Und ich bin mir sehr sicher,

00:06:09: dass wir mit Laravel 4 gearbeitet haben.

00:06:11: Das heißt, wir müssen zwischen 2013 und 2015

00:06:14: schon mal Kontakt mit Laravel gehabt haben.

00:06:17: Und ich glaube, das war in dem Projekt,

00:06:19: kann man jetzt nicht schlecht sagen,

00:06:20: da haben wir jedenfalls so einen Online-Konfigurator gebaut.

00:06:23: Und da haben wir,

00:06:25: wir haben anfangs sogar Lumen eingesetzt.

00:06:27: Das ist ja, glaube ich,

00:06:27: ganz von der Bildfläche verschwunden.

00:06:30: War aber mal so ein abgespecktes Laravel.

00:06:32: Kannst du dich daran erinnern?

00:06:33: Also ich hatte ja dieses Jahr Zehnjähriges.

00:06:36: Das heißt, alles, was so vor 2015 in der Firma los war,

00:06:40: kann ich vielleicht nur so aus Hören sagen.

00:06:42: Aber jetzt, wo du so erzählst,

00:06:43: an Lumen kann ich mich auch noch erinnern.

00:06:45: Und ja, das ist so ein bisschen hinten übergefallen.

00:06:48: Das war mal so ein Micro-Framework für so Microservices.

00:06:52: Also so ein ganz, ganz abgespecktes Ding.

00:06:54: Und ich habe mir gedacht,

00:06:55: und inzwischen kann man eher das Laravel so verbiegen,

00:06:58: dass es auch für so Microservices funktioniert.

00:07:01: Dann braucht es dann dieses Lumen nicht mehr zwangsläufig.

00:07:03: Aber jetzt, wo du das sagst,

00:07:04: da läutet es auch dunkel bei mir.

00:07:07: Genau.

00:07:08: Ja, aber wir setzen Laravel ja trotzdem seit zehn Jahren ein

00:07:11: oder über zehn Jahren.

00:07:12: Kommt auch nicht so ganz genau darauf an.

00:07:14: Was war deine Frage?

00:07:15: Warum wir es einsetzen?

00:07:16: Wie wir darauf gekommen sind ursprünglich.

00:07:17: Ach, wie wir darauf gekommen sind.

00:07:19: Ja, wenn man noch weiter zurückgeht,

00:07:21: habe ich ja schon mit relativ vielen PHP-Frameworks gearbeitet.

00:07:24: Ich kriege die jetzt nicht mehr alle auf den Schirm,

00:07:26: aber Symfony war auf jeden Fall dabei, CakePHP.

00:07:29: Und wenn ich jetzt eine Liste vor mir hätte,

00:07:31: würde ich dir noch zwei, drei andere sagen.

00:07:32: Zend habe ich nur immer so halb Berührung mitgehabt.

00:07:36: Ich glaube, Magento hat darauf mal basiert.

00:07:38: Deswegen hatte ich da so ein bisschen Berührungspunkte.

00:07:41: Jedenfalls habe ich schon relativ viel ausprobiert

00:07:42: und keins war so richtig zufriedenstellend.

00:07:45: Die waren jetzt auch nicht alle gerade schlecht,

00:07:47: aber keins, was einen so richtig überzeugt hat.

00:07:49: Und dann kam Laravel.

00:07:52: Ja, und das war so eine Zeit,

00:07:53: da haben wir ganz viel ausprobiert.

00:07:54: Machen wir bis heute.

00:07:54: Machen wir bis heute eigentlich.

00:07:55: Und irgendwie kam mir das cooler vor.

00:07:57: Und das war so modern.

00:07:58: Elegant.

00:07:59: Funktioniert.

00:08:00: Genau.

00:08:01: Und das hat mich eigentlich vom Start weg überzeugt.

00:08:04: Und dann sind wir so ein bisschen dabei geblieben.

00:08:05: Und zu unserer Freude ist es ja bis heute sehr aktuell.

00:08:09: Und ich würde mal behaupten,

00:08:10: auch das bekannteste und beliebteste PHP-Framework.

00:08:13: Ja, genau.

00:08:14: Also, wenn man uns fragt, warum wir Laravel verwenden,

00:08:17: dann ist das, finde ich, eigentlich eine dreigeteilte Frage.

00:08:20: Die erste Frage ist, warum benutzen wir überhaupt PHP?

00:08:22: Da haben wir schon eine Folge zu gemacht.

00:08:24: Die zweite Frage ist,

00:08:25: warum benutzt man überhaupt irgendein Framework

00:08:28: außerhalb von normalem PHP?

00:08:31: Die dritte Frage ist dann,

00:08:33: warum denn spezifisch Laravel

00:08:34: und nicht irgendeines von den anderen,

00:08:36: was du da gerade erwähnt hast?

00:08:38: Und warum man lieber ein Framework verwenden sollte

00:08:41: oder wir lieber ein Framework verwenden als natives PHP,

00:08:45: ist, dass so ein Framework,

00:08:46: und das gilt wahrscheinlich für alle,

00:08:48: die du gerade genannt hast,

00:08:49: einem schon sehr viel von den Dingen abnimmt,

00:08:53: die man eh tagtäglich,

00:08:54: bei der Arbeit mit braucht

00:08:55: und relativ viel Boilerplate

00:08:57: um die eigentliche Domain-Logik drumherum einem abnimmt.

00:09:01: Also zum Beispiel,

00:09:02: wie funktionieren Datenbank-Interaktionen?

00:09:05: Wie kann ich das in der App abbilden?

00:09:08: Stichwort Models oder ORMs.

00:09:10: Wie läuft das mit der Validierung, mit der Autorisierung?

00:09:13: Das sind alles Sachen, die müsste ich mir,

00:09:15: wenn ich nur PHP benutze,

00:09:16: selber mühsam erarbeiten

00:09:18: und vielleicht irgendwelche Helps-Klassen bauen

00:09:21: oder irgendwelche Konstrukte,

00:09:22: die ich dann wiederverwenden kann.

00:09:23: Und das ist natürlich,

00:09:24: wenn ich nur PHP benutze,

00:09:24: aufwendig und fehleranfällig.

00:09:26: Und so ein Framework nimmt einem das auch schon ab,

00:09:28: indem es sagt,

00:09:29: hier, schau mal,

00:09:30: das ist hier unser Datenbank-Konzept,

00:09:31: das ist unser Validierungskonzept

00:09:33: und das ist Autorisierungskonzept.

00:09:35: Oder jetzt mein neues Lieblingsstichwort,

00:09:37: Queue.

00:09:37: Das ist ja ein total mächtiges Feature,

00:09:39: auch in Laravel.

00:09:41: Das selber über nur PHP abzubilden,

00:09:43: ist ganz schön aufwendig.

00:09:45: Ja, absolut.

00:09:46: Routing zum Beispiel ist auch noch so ein Thema.

00:09:48: Und was ich ganz wichtig finde,

00:09:49: dass einem auch eine Datenstruktur

00:09:52: oder eine Ordnerstruktur vorgegeben wird

00:09:53: durch das,

00:09:54: durch das Framework

00:09:55: und man bestenfalls auch so eine Wiedererkennung hat.

00:09:57: Also wenn ich ein Laravel-Projekt aufmache,

00:09:59: jetzt habe ich vor drei Tagen

00:10:00: ein neues Projekt bekommen,

00:10:02: bestehendes Laravel-Projekt,

00:10:03: was wir übernehmen sollen

00:10:04: und man findet sich sofort zurecht,

00:10:06: weil man die Ordnerstrukturen kennt.

00:10:08: Da kann man einen kleinen Exkurs machen,

00:10:09: dass die irgendwann mal

00:10:10: das Models-Verzeichnis gekillt haben.

00:10:11: Aber ansonsten kommt einem ein Laravel-Projekt

00:10:14: immer vertraut vor

00:10:16: mit dem App-Verzeichnis,

00:10:17: Database-Verzeichnis,

00:10:18: mit den Resources,

00:10:19: mit dem Public-Ordner und so weiter.

00:10:21: Und das ist natürlich auch ein Riesenvorteil,

00:10:22: wenn man in einem Framework unterwegs ist

00:10:23: und sich,

00:10:24: nicht in selbst gebastelten Code eindenken muss,

00:10:27: der ja in der Theorie,

00:10:28: wenn man jetzt so MVC,

00:10:29: zum Beispiel Design-Patterns folgt,

00:10:31: auch ähnlich aufgebaut sein soll,

00:10:32: aber dann doch nicht genau gleich heißt

00:10:34: und dann schwieriger zu verstehen ist.

00:10:35: Dazu kommt dann noch,

00:10:36: dass diese Frameworks natürlich

00:10:38: auch schon sehr bedacht sind,

00:10:39: so klassische Sicherheitsbedenken

00:10:42: aus dem Weg zu schaffen.

00:10:43: Also Thema SQL-Injection

00:10:45: oder Cross-Site-Scripting,

00:10:47: wenn es um Frontend geht.

00:10:49: Das sind Dinge,

00:10:49: da muss man sehr gut drüber nachdenken,

00:10:51: wenn man mit nativem PHP unterwegs ist,

00:10:54: dass man da kein Einfallstor baut.

00:10:56: Diese Frameworks,

00:10:57: die haben das natürlich alles schon berücksichtigt

00:10:59: und bauen ihre ganzen Konzepte so,

00:11:01: dass du dich schon wirklich anstrengen musst,

00:11:03: um irgendwie so eine SQL-Injection

00:11:05: in die Datenbank zu bekommen.

00:11:06: Das machen die nicht ohne weiteres.

00:11:09: Ja, Laravel macht ja nicht nur Datenbank-Interaktionen,

00:11:11: sondern Laravel hat ja ein ganzes Framework

00:11:13: eigentlich nur für Datenbank.

00:11:15: Ja, ich rede jetzt gar nicht konkret über Laravel,

00:11:17: sondern eher so Frameworks im Allgemeinen

00:11:19: im Vergleich zu nativem PHP.

00:11:20: Warum spezifisch Laravel,

00:11:22: da würde ich gleich nochmal extra drauf kommen,

00:11:24: das ist nämlich auch ein gutes Thema.

00:11:26: Was ich auch spannend finde,

00:11:27: da habe ich früher auch so gar nicht drüber nachgedacht,

00:11:29: ist dadurch, dass diese Frameworks ja auch schon

00:11:32: feste Ideen dazu haben,

00:11:34: wie jetzt zum Beispiel Validierung oder Autorisierung funktioniert,

00:11:38: was ja auch sehr, sehr wichtig

00:11:39: für die Sicherheit der Anwendung ist,

00:11:41: die haben das dann halt in der Dokumentation schon da drin

00:11:44: und deswegen stolper ich einfach darüber,

00:11:46: wenn ich mich mit dem Framework beschäftige,

00:11:48: selbst wenn ich von mir aus gar nicht auf die Idee gekommen wäre,

00:11:51: sowas wie Input-Validierung zu machen.

00:11:53: Also das richtet sich dann wirklich

00:11:54: an ganz, ganz unerfahrene Programmierer,

00:11:57: aber man kann so eine Anwendung mit normalem PHP

00:12:00: auch auf die Beine stellen,

00:12:02: ohne dass man an solche Sachen denkt

00:12:03: und Laravel oder die anderen Frameworks,

00:12:06: die stoßen einen so ein bisschen da drauf,

00:12:08: indem sie sagen, hier guck mal,

00:12:09: Validierung, total wichtiges Thema,

00:12:10: so machen wir das,

00:12:11: ist das nicht vielleicht auch was für dich?

00:12:13: Und deswegen, also wer heute noch eine Anwendung

00:12:16: in nativem PHP baut,

00:12:18: der hat, glaube ich, ganz schön viel Geld übrig.

00:12:20: Oder eine sehr gute AI.

00:12:21: Ja.

00:12:23: Oder das.

00:12:24: Aber auch die wird ja sehr viel Code erzeugen.

00:12:26: Ja, das stimmt.

00:12:27: Und warum wir uns jetzt spezifisch für Laravel entschieden haben,

00:12:31: hast du vorhin schon ein bisschen hergeleitet.

00:12:32: Einfach relativ eleganter Code,

00:12:35: aber das ist ja auch ein bisschen subjektiv.

00:12:38: Ich fange es vielleicht andersrum an.

00:12:39: Wenn man mal bei GitHub nach dem PHP-Topic sucht

00:12:43: und dann nach Sternen sortiert,

00:12:45: dann springt einem direkt das Laravel-Projekt ins Gesicht.

00:12:48: Also das Framework selber hat zwar nur 33.000 Sterne,

00:12:51: das übergeordnete,

00:12:53: das erste Laravel-Projekt hat 81.000.

00:12:56: Da ist also schon ordentlich was los.

00:12:57: Danach Symfony mit 30.000 Sternen

00:13:00: und dann das Nächste, was ich gefunden habe,

00:13:02: war dann Codeigniter, was mir was gesagt hat,

00:13:04: mit 18.000.

00:13:05: Aber da sieht man schon einfach diese Dominanz von Laravel

00:13:08: und das ist natürlich sehr wertvoll,

00:13:10: wenn man heutzutage sich für ein neues Framework entscheidet,

00:13:13: weil so ein Riesen-Framework natürlich ein paar Vorteile bringt.

00:13:16: Zum Beispiel gibt es einfach die meisten Dokumentationen

00:13:20: und Tutorials

00:13:21: und die größte Community im Internet,

00:13:24: sodass die einem bei allen Problemen,

00:13:26: die einem so begegnen, helfen können.

00:13:29: Es gibt viele Tools,

00:13:31: die um Laravel drumherum gebaut sind,

00:13:34: irgendwelche zusätzlichen Packages und Driver

00:13:37: und weiß ich nicht was,

00:13:38: kommen wir gleich auch nochmal zu.

00:13:40: Und der letzte Punkt,

00:13:41: und dann darfst du auch mal wieder was sagen,

00:13:43: ist der, den du gerade schon angesprochen hast,

00:13:44: nämlich es ist total hilfreich,

00:13:46: wenn man sich in der Firma auf ein so ein Framework spezifiziert,

00:13:51: weil man dann gute Kompetenzen bilden kann

00:13:54: und die in anderen Projekten wiederverwenden.

00:13:56: Du hast es gerade gesagt,

00:13:57: du kennst Laravel, kommst in ein neues Laravel-Projekt ein

00:14:00: und kennst dich sofort aus und kannst da losarbeiten.

00:14:03: Ja und dass Laravel so beliebt ist, so viel eingesetzt wird,

00:14:06: das ist natürlich für uns auch ein ganz entscheidender wirtschaftlicher Faktor,

00:14:09: weil wir natürlich, wenn wir jetzt mit einem Nischen-Framework arbeiten würden,

00:14:13: dann würden wir ja gar nicht speziell dafür unbedingt Aufträge bekommen.

00:14:17: Und Laravel-Aufträge gibt es jetzt auch nicht irre viel,

00:14:19: weil ich glaube, wenn man das jetzt im Verhältnis,

00:14:20: jetzt zu Spring Boot oder sowas,

00:14:23: ist es wahrscheinlich trotzdem noch ein Nischen-Dasein.

00:14:25: Und trotzdem gibt es natürlich wesentlich mehr Laravel-Projekte

00:14:28: als dann, ich sage jetzt mal, Send oder Symphony-Projekte.

00:14:31: Wobei Symphony sehe ich auch erstaunlich oft, muss ich sagen.

00:14:34: Ich weiß nicht, ob das alles so Legacy ist

00:14:35: oder ob das Leute auch in der aktuellen Version noch abfeiern,

00:14:38: bin ich nicht so aktuell.

00:14:39: Aber das sehe ich jedenfalls auch immer nochmal wieder.

00:14:40: Aber danach kommt kein PHP-Framework mehr.

00:14:43: Und deswegen müssen wir uns eigentlich aus wirtschaftlichen Gründen

00:14:45: schon auf Laravel fokussieren.

00:14:47: Und es macht aber auch technisch Sinn.

00:14:49: Und die Kombination ist halt ganz gut.

00:14:51: Und Laravel spezifisch gibt uns auch sehr viele Features an die Hand,

00:14:55: die wir gerne nutzen.

00:14:57: Deswegen setzen wir das auch nach wie vor mit großer Begeisterung ein.

00:15:00: Ich habe mir mal so aus meinem Alltag vier Features rausgesucht,

00:15:03: die ich an Laravel besonders gut finde.

00:15:06: Das heißt jetzt nicht, dass die anderen das nicht haben.

00:15:08: Aber das sind welche, die wir sehr exzessiv jeden Tag einsetzen

00:15:12: und uns darüber freuen, dass es die gibt.

00:15:14: Das erste, das ist das ORM-Feature.

00:15:17: Das haben aber, glaube ich, alle Frameworks, die es so gibt.

00:15:20: Und für, habe ich gerade noch extra rausgesucht, weil ich es nicht wusste,

00:15:23: Object Relation Mapping.

00:15:26: Und das bedeutet, dass du ein Objekt,

00:15:30: üblicherweise das aus der Datenbank kommt,

00:15:32: in deiner Anwendung nochmal nachbaust, wenn man so möchte,

00:15:37: um damit besser arbeiten zu können.

00:15:40: Und das ist in Laravel durch Models gelöst.

00:15:42: Wie gesagt, das Konzept gibt es auch in anderen Anwendungen.

00:15:44: Aber in Laravel sind es eben Models.

00:15:46: Und die sind so eine automatische Brücke zu der Datenbank.

00:15:49: Das sind PHP-Objekte.

00:15:52: Und durch ganz viel Laravel-Magie im Hintergrund

00:15:54: bekommen die aber automatisch die Felder und Werte

00:15:59: aus der entsprechenden Datenbank-Tabelle.

00:16:02: Und so kann man ganz einfach mit denen arbeiten

00:16:04: und für bestimmte Models, also bestimmte Datenbank-Reihen,

00:16:08: die Werte setzen, speichern, updaten.

00:16:11: Man kann aber auch da gleich Queries drauf ausführen auf diesem Model.

00:16:15: Sowas wie, kriegt mir mal alle,

00:16:16: die zu einem bestimmten Zeitpunkt erstellt wurden.

00:16:19: Also das, was man in nativem PHP

00:16:21: durch tatsächliche SQL-Querys schreiben würde,

00:16:26: das wird hier abgebildet durch sehr abstrakte,

00:16:29: aber gut lesbare und gut wiederverwendbare Queries.

00:16:34: Ganz wichtig in Laravel ist ja,

00:16:36: oder überhaupt in den Frameworks wahrscheinlich insgesamt,

00:16:38: dass man auch Relationen abbilden kann.

00:16:40: Also ich kann jetzt zum Beispiel einem User sagen,

00:16:42: dass er zu einer Company gehört.

00:16:44: Und das gebe ich halt direkt in diesem Model an

00:16:46: und muss jetzt nicht auf Datenbank-Ebene irgendwas einstellen.

00:16:48: Das könnte.

00:16:49: Das könnte dann aber alle User zu einer bestimmten Company

00:16:52: zum Beispiel sehr einfach abfragen.

00:16:53: Also so Company-Users, das ist ja dieses Eloquent dann,

00:16:57: vielleicht muss ich das Stichwort auch nochmal droppen hier,

00:17:00: das in Laravel eben diese ganzen Abfragen macht.

00:17:03: Also ich glaube für die 90% oder 95,

00:17:06: die uns zuhören und Laravel kennen

00:17:08: oder zumindest so ein ORM-Modell in irgendeinem anderen Framework,

00:17:11: die denken sich jetzt, was erzählen die da für einen Quatsch?

00:17:13: Das weiß doch jedes Kind.

00:17:14: Für die 5%, die jetzt denken, hä, was ist denn ein ORM-Model?

00:17:17: Ich mache das immer mit.

00:17:18: Ich mache das mit echten SQL-Querys,

00:17:20: die ich als String in mein PHP-Ding reinschreibe,

00:17:23: Podcast pausieren und Google Search auf und ORM eintippen.

00:17:27: Also ich glaube, da müssen wir jetzt gar nicht so in die Tiefe gehen.

00:17:29: Das ist einfach, glaube ich, so mit das wichtigste Konzept,

00:17:32: wenn man so eine Anwendung baut.

00:17:34: Ja, ich komme ja von nativem SQL damals noch,

00:17:37: also wo wir wirklich Queries auch selbst geschrieben haben.

00:17:40: Und da war ich auch sehr fit, würde ich auch bis heute behaupten.

00:17:44: Und dann ist natürlich schon ein Umstieg,

00:17:46: wenn man auf so ein Eloquent zum Beispiel dann geht

00:17:48: und dann alles, was man eigentlich normalerweise schreiben würde,

00:17:50: also ein Join oder so,

00:17:52: dass man das dann auf einmal mit so Funktionen abbilden soll.

00:17:55: Wenn man damit aber eine Zeit lang arbeitet,

00:17:57: dann merkt man schon, was das für Vorteile hat.

00:17:58: Und dass es halt sehr einheitlich dann am Ende wirkt,

00:18:01: wenn man das über so ein Modell macht.

00:18:03: Und dieses Eloquent, das nimmt einem eben ganz viele Zwischenschritte ab,

00:18:08: die man sonst händisch noch einbauen müsste.

00:18:10: Die automatisieren diese Abfragen dann direkt schon für einen mit.

00:18:13: Wenn wir jetzt an die Bewerbung denken,

00:18:14: dann könnte man auch sagen, dass dieses Model- oder ORM-Pattern

00:18:17: auch eigentlich dafür da ist, um so eine Abstraktion in der Anwendung

00:18:21: von der Datenebene zu finden,

00:18:24: dass man nicht innerhalb der Anwendung genau auf die Datenbank festgelegt ist

00:18:28: und zum Beispiel in der Theorie im Nachhinein die Datenbank ändern könnte,

00:18:33: entweder ein änderes Datenbankkonzept oder dann vielleicht Sachen als Datei schreiben.

00:18:38: Und in deiner ganzen Anwendung, so der Idealfall,

00:18:41: arbeitest du eben nur mit diesen abstrakten Modeln

00:18:43: und in dem Model selber kannst du dann spezifisch sagen,

00:18:46: wo die Sachen jetzt hingespeichert werden

00:18:48: und zu welchen Feldern die gemappt werden oder sonst irgendwas,

00:18:51: sodass du in der Theorie das nachträglich noch austauschen kannst

00:18:54: und durch das Repository-Pattern so eine Abstraktion hast.

00:18:58: Aber also ehrlicherweise, das haben wir noch nie benutzt

00:19:01: in unseren Anwendungen, die wir so haben.

00:19:04: Das weiß ich gar nicht, Kay, weil das Laravel an sich Datenbank-agnostisch ist,

00:19:08: finde ich eigentlich ziemlich cool,

00:19:09: weil wir doch öfter schon mal in der Entwicklung eine SQLite-Datenbank,

00:19:13: also SQLite heißt es, glaube ich, Datenbank verwendet haben

00:19:15: und das ist dann auch so, dass wir dann auch noch mal eine Datenbank haben.

00:19:15: Und das ist dann auch so, dass wir dann auch noch mal eine Datenbank haben.

00:19:15: Und dann im Live-Betrieb aber zum Beispiel eine SQL- oder eine MariaDB-Datenbank.

00:19:20: Und das fand ich eigentlich mal sehr praktisch,

00:19:22: gerade wenn man auch ein Projekt, was man nur kurz auschecken will,

00:19:25: dass man sich da nicht irgendwie eine riesen Datenbank aufsetzen muss,

00:19:27: sondern einfach mal eben SQLite draufpacken kann,

00:19:29: zur Not auch die Datei eben verschicken kann an jemand anders.

00:19:32: Und das fand ich eigentlich mal ziemlich praktisch.

00:19:34: Das stimmt in der Theorie.

00:19:37: In der Praxis ist es bis jetzt allerdings immer vorgekommen,

00:19:40: dass wenn so eine Anwendung wächst

00:19:41: und auch das über so klassische Crude-Endpunkte hinausgeht,

00:19:45: dass man dann doch irgendwelche komplizierteren Queries schreibt

00:19:49: und dann doch sehr nah an die Datenbank drangeht,

00:19:52: einfach um Performance-Optimierungen rauszuholen.

00:19:55: Und das dann in der ganzen Anwendung so zu lösen,

00:19:58: dass es wieder Datenbank-agnostisch ist

00:20:00: und auf einer SQLite-Datenbank genauso funktioniert

00:20:02: wie auf einer MariaDB oder MySQLDB,

00:20:05: das ist dann doch schon sehr hakelig,

00:20:07: zumindest in dem Umfang, wie wir es einsetzen.

00:20:09: Aber in der Theorie stimmt das schon,

00:20:11: zumindest für die groben Sachen lässt sich das einfach umsetzen.

00:20:15: Dann mache ich weiter mit der Frage,

00:20:15: was ist mit dem zweiten Feature?

00:20:17: Das finde ich persönlich ziemlich cool.

00:20:18: Da nehme ich auch an, dass es die in anderen Frameworks gibt.

00:20:21: Und zwar ist es das Dependency Injection und Road Model Binding.

00:20:26: Das sind zwei verschiedene Konzepte,

00:20:28: die aber ungefähr gleich funktionieren.

00:20:30: Nämlich, wie formuliere ich es abstrakt?

00:20:33: Auch lieber nachschlagen, wenn ihr davon noch nie gehört habt.

00:20:36: Laravel kann an bestimmten Stellen Vermutungen darüber treffen,

00:20:41: welche PHP-Klassen du gerade brauchst

00:20:43: und sie dir automatisch,

00:20:45: als Instanz injecten.

00:20:47: Also das sieht ganz abstrakt so aus.

00:20:50: Ich habe irgendwo eine Controller-Funktion,

00:20:53: eine Methode in der Controller-Klasse und sage,

00:20:55: ich brauche jetzt an dieser Stelle eine andere Klasse,

00:20:58: die heißt User-Service oder so.

00:21:01: Und die definiere ich nur über den Parameter der Methode,

00:21:05: dass ich sage, hier, ich brauche eine Variable User-Service vom Typ,

00:21:09: geht inzwischen mit PHP User-Service.

00:21:12: Und zur Laufzeit geht Laravel dann hin, schaut nach,

00:21:15: ob es diese Klasse braucht.

00:21:15: Und wenn ja, packt es mir eine neue Instanz direkt als Parameter rein,

00:21:20: ohne dass ich die selber instanziieren muss, diese neue Klasse.

00:21:24: Und dieses Route-Model-Binding,

00:21:25: das ist quasi ein zusätzlicher Baustein auf dieser Dependency-Injection.

00:21:30: Wenn ich nämlich eine Controller-Methode mit einer Web-Route verknüpft habe

00:21:34: und zum Beispiel unter eine URL aufrufen möchte mit User-slash-1,

00:21:40: dann erwarte ich ja in der Methode,

00:21:42: dass ich irgendwie einen User mit der ID einsetze,

00:21:45: und da kann ich eben über diese Route-Model-Binding,

00:21:49: über so eine bisschen krude Syntax,

00:21:50: die ich jetzt gar nicht erst versuche zu erklären,

00:21:53: aber der Methode sagen,

00:21:55: ich hätte gerne einen Parameter User vom Typ User.

00:22:00: Und Laravel kann dann automatisch diese Verknüpfung bringen zwischen,

00:22:04: okay, ich habe hier einen Models-Namens-User

00:22:06: und in der URL steht irgendwie die ID eins.

00:22:09: Dann versuche ich doch mal in der Datenbank,

00:22:12: in der Users-Tabelle, was mit der ID eins zu finden.

00:22:14: Und wenn ich das tue,

00:22:15: dann bekomme ich genau dieses Model als Parameter da rein

00:22:18: und kann mit diesem Model interagieren.

00:22:20: Und wenn es aber nicht klappt und das nicht da ist oder so,

00:22:23: dann macht Laravel für mich ganz automatisch so ein Error-Handling von,

00:22:27: hey, hier 404-Status-Code setzen und solche Dinge.

00:22:31: Also Dinge, die ich sonst eigentlich selber in meinem Code geschrieben hätte

00:22:34: und die viel Platz von der eigentlichen Business-Logik weggenommen hätten,

00:22:39: die nimmt mir jetzt auf einmal Laravel automatisch einfach ab.

00:22:43: Ich würde mal sagen, dieses Route-Model-Binding,

00:22:44: das ist auch eine der Sachen,

00:22:45: weshalb viele Leute sagen, in Laravel passiert viel Magic.

00:22:49: Also Laravel versucht einem ja im Hintergrund viel abzunehmen.

00:22:52: Und gerade das ist ein Feature, wenn man es kennt,

00:22:54: super cool, super einfach, räumt deinen Code auf,

00:22:57: kannst du schnell mitarbeiten.

00:22:59: Wenn du das nicht kennst, dann fragst du dich,

00:23:01: raufst du dir die Haare, wo kommt jetzt dieses Objekt her?

00:23:04: Oder kommt das aus thin air, wie man in Englisch sagen würde?

00:23:08: Da muss man natürlich sich ein bisschen mit Laravel vertraut machen,

00:23:10: um das zu verstehen.

00:23:11: Und das ist, glaube ich, einer der Punkte,

00:23:12: wo man sich am Anfang mit beschäftigen muss.

00:23:15: Ein anderer Punkt, den ich inzwischen nützlicher finde als früher,

00:23:20: ist das Form-Request-Konzept.

00:23:23: Und zwar, auch wieder das Stichwort,

00:23:26: schnell mal bei Laravel-Doku eintippen,

00:23:28: die übrigens fantastisch ist, das wollte ich nur nochmal gesagt haben.

00:23:31: Also da steht alles drin.

00:23:32: Bei jedem HTTP-Request ist immer die Frage,

00:23:35: wie kann ich jetzt sicherstellen,

00:23:37: dass da die Autorisierung richtig ist?

00:23:39: Also dass derjenige, der eine Route aufgerufen hat,

00:23:42: das auch tatsächlich darf.

00:23:44: Entweder, weil er angemeldet ist,

00:23:45: oder weil er irgendwelche Relationen hat, die nötig sind.

00:23:49: Und das Zweite ist, insbesondere bei Post-Requests,

00:23:52: sind dann die ganzen Felder, die er mir übergibt,

00:23:54: so wie ich sie gerne möchte.

00:23:57: Also klassische Form-Validierung,

00:23:59: sind alle Felder da, die ich erwarte?

00:24:02: Entsprechen sie den Längen?

00:24:03: Und entsprechen sie ansonsten den Kriterien?

00:24:05: Das ist alles Logik, die wir früher direkt in der Controller-Methode gemacht haben.

00:24:10: Da war dann also erst ein Block Autorisierung,

00:24:13: so ganz wasserfallmäßig.

00:24:15: Danach ein Block,

00:24:15: mit der Validierung, alles so schön untereinander.

00:24:17: Und dann darunter so ein dritter Block,

00:24:19: mit der eigentlichen Business-Logik,

00:24:21: was immer ich so vorhabe.

00:24:23: Und das nimmt einfach sehr viel Raum ein,

00:24:26: und relativ redundanter Code.

00:24:29: Und dann haben wir irgendwann mal angefangen,

00:24:31: das über Form-Requests abzubilden.

00:24:33: Und das ist ein eigenes Konzept, eine eigene Klasse,

00:24:37: die sich nur mit der Autorisierung und Validierung beschäftigt.

00:24:40: Das ist auch ganz elegant gelöst,

00:24:41: dass es da einfach eine Authorize-Methode und eine Validate-Methode gibt,

00:24:45: da kann ich sehr einfach konfigurieren, was ich gerne hätte.

00:24:49: Laravel bietet da auch einen ziemlich großen Satz an Regeln an,

00:24:53: die ich einfach benutzen kann,

00:24:54: um bestimmte Aspekte des Inputs für die Validierung zu prüfen.

00:24:58: Und diese Request-Klasse wiederum,

00:25:01: da wieder das Magische mit der Dependency Injection,

00:25:05: gebe ich einfach nur als Methoden-Parameter an.

00:25:09: Und Laravel, wieder mit seiner großen Magie im Hintergrund,

00:25:12: prüft automatisch, ob die Autorisierung geklappt hat,

00:25:15: anhand der Methode, die ich definiert habe,

00:25:17: ob die Validierung geklappt hat,

00:25:19: anhand der Regeln, die ich definiert habe.

00:25:21: Und nur wenn beides geklappt hat,

00:25:23: dann komme ich überhaupt erst in meine Controller-Methode rein.

00:25:26: Und das heißt, meine Controller-Methode ist zum einen sehr aufgeräumt,

00:25:30: weil diese ganze Autorisierung und Validierung raus ist,

00:25:33: und zum anderen aber auch, ist das nur mein Happy Path,

00:25:37: also ich gehe nur von den besten Zuständen aus

00:25:40: und die ganzen Fehlerfälle, die vorher passieren können,

00:25:43: die fängt Laravel auch wieder an, um zu prüfen, ob das gut ist.

00:25:43: Und Laravel, wieder mit seiner großen Magie im Hintergrund,

00:25:43: die vorher passieren können, die fängt Laravel auch wieder an,

00:25:43: die ganzen Fehlerfälle, die vorher passieren können,

00:25:43: die fängt Laravel auch wieder automatisch ab

00:25:46: und baut auch direkt die Responses richtig.

00:25:48: Also wenn die Autorisierung nicht geklappt hat,

00:25:50: dann macht Laravel ganz automatisch den entsprechenden Status-Code da rein.

00:25:54: Und wenn die Validierung nicht geklappt hat,

00:25:56: weil ich zum Beispiel bei einem Post-Request ein Feld erwarte,

00:26:00: das aber nicht da ist vom Nutzer,

00:26:02: dann formatiert es mir automatisch eine Antwort-Response

00:26:07: und dort steht dann automatisch drin,

00:26:09: hier, schau mal, dieses Feld hat diese und diese und diese und diese Fehler,

00:26:13: sodass ich dann wiederum das ganz einfach im UI anzeigen kann.

00:26:18: Und alles mit relativ wenig Aufwand,

00:26:21: ganz viel Mühe abgenommen von Laravel.

00:26:23: Ja, und der schöne Nebeneffekt ist,

00:26:25: dass man die Sachen nicht alle im Controller hat,

00:26:28: also nicht viel Logik im Controller hat

00:26:29: und deswegen auch viel besser testen kann,

00:26:31: weil die Controller fällt uns immer ein bisschen schwer zu testen,

00:26:33: die Sachen, die da drin sind,

00:26:34: während wir einen Request gut testen können,

00:26:36: einen Service, den wir dazu schreiben, können wir gut testen,

00:26:38: eine Model könnte man theoretisch testen

00:26:40: und alles, was so dazugehört.

00:26:42: Und wenn wir dann auch noch mal die Fehlerfälle, die wir da drin haben, haben,

00:26:43: dann ist es so natürlich viel aufgeräumter.

00:26:45: Die Controller, die wir haben,

00:26:46: haben in den Funktionen ja oft nur fünf, sechs Zeilen,

00:26:48: da ist meistens gar nicht viel drin.

00:26:50: Da wird die Validierung getriggert

00:26:51: und dann kommt am Ende ein Rückgabewert

00:26:53: und dann sind wir eigentlich schon fertig damit.

00:26:55: Genau.

00:26:56: Und das hat sich eigentlich für uns sehr gut bewährt.

00:26:57: Also wer einmal so ein Refactoring gesehen hat

00:27:00: von alles im Controller versus aufgeteilt in den Request,

00:27:03: der kann eigentlich nicht mehr zurück, glaube ich,

00:27:05: weil das ist wirklich so sauber und elegant

00:27:08: und eigentlich das, was Laravel auch vermittelt,

00:27:10: durch sehr, sehr viel Magie einem selber viel Last abnehmen,

00:27:12: die man sonst immer wieder machen müsste.

00:27:14: Zumal man ja Request auch an verschiedenen Stellen benutzen kann

00:27:17: und dann ist natürlich auch wiederverwendbar.

00:27:19: Ganz genau.

00:27:20: Der vierte Punkt, der jetzt immer mehr in den Fokus tatsächlich auch bei mir rückt,

00:27:24: ist so das Konzept der Queue.

00:27:27: Das ist schon ein bisschen advanced,

00:27:29: aber je mehr ich damit mache, desto mächtiger finde ich das.

00:27:31: Bei so einer Anwendung kommt es ja immer wieder vor,

00:27:34: dass man Aufgaben erledigen muss,

00:27:36: die einfach mehr Zeit in Anspruch nehmen

00:27:39: für so Computerverhältnisse.

00:27:41: Ja.

00:27:42: Ja.

00:27:42: Und da möchte man den Nutzer nicht unbedingt darauf warten lassen.

00:27:45: Ein klassisches Beispiel ist,

00:27:46: bei irgendeinem Request wird eine E-Mail getriggert,

00:27:50: also dass eine E-Mail versendet wird.

00:27:51: Und das dauert in so Computerzeiten gesprochen ja relativ lange,

00:27:56: weil da ein externer Service angepängt werden muss,

00:27:58: das kann schiefgehen und so weiter.

00:28:00: Und damit der User jetzt nicht die ganze Zeit auf eine Antwort warten muss,

00:28:03: kann man solche Sachen in die Queue auslagern.

00:28:06: Das bedeutet, in dem eigentlichen Request, den der User getriggert hat,

00:28:10: wird nur ein neuer Queue-Job,

00:28:12: angelegt und dann kommt direkt eine Response

00:28:15: und der Request ist direkt fertig.

00:28:17: Und diese Queue ist im einfachsten Fall so eine Datenbank,

00:28:20: wo einfach immer wieder neue Jobs reingeschoben werden.

00:28:23: Und Jobs kann man sich so ein bisschen vorstellen wie,

00:28:25: ja, einzelne Methoden, die dann zeitverzögert aufgerufen werden.

00:28:30: Und in diesen Jobs können dann zum Beispiel E-Mails versendet werden

00:28:33: oder was man sonst immer so haben möchte,

00:28:35: was ein ganz klein bisschen mehr Zeit in Anspruch nimmt.

00:28:37: Und dann gibt es parallel zur eigentlichen Anwendung,

00:28:40: die auf HTTP-Requests zählt,

00:28:41: gibt es noch so einen Queue-Worker.

00:28:43: Das ist also ein eigenständiger Prozess,

00:28:45: der die ganze Zeit im Hintergrund läuft

00:28:47: und der sich immer den neuesten Job schnappt und den ausführt

00:28:51: und dann den nächsten und dann den nächsten und dann den nächsten.

00:28:53: Und das ist so ein bisschen asynchron dann

00:28:56: und dadurch nimmt es nicht so viel Zeit von der Hauptanwendung weg.

00:28:59: Und man kann aber auch mächtige Dinge damit tun.

00:29:02: Zum Beispiel, wenn die gefailt sind,

00:29:04: dann kann man relativ einfach sehen, woran das gelegen hat

00:29:07: und die einfach nochmal in die Queue reinschieben,

00:29:09: wenn die Fehlerursache gelöst ist.

00:29:10: Das heißt, wenn es also wichtig ist,

00:29:12: dass irgendwelche Dinge tatsächlich passieren

00:29:14: und die aber auch leicht fehlerbehaftet sein können,

00:29:17: zum Beispiel E-Mail,

00:29:19: dann kann man das leicht über diese Queue steuern,

00:29:21: dass die auch wieder angestoßen werden.

00:29:23: Also ein praktisches Beispiel wäre,

00:29:25: ein Nutzer hat sich gerade registriert

00:29:28: und bekommt jetzt eine E-Mail mit so einem Bestätigungscode.

00:29:31: Und wenn es in der Queue ist,

00:29:33: dann wird dieser Job irgendwann abgearbeitet.

00:29:36: Idealerweise ist die Queue relativ leer,

00:29:38: sodass der Job dann dort ist,

00:29:39: sodass der Job dann doch schnell ausgeführt wird.

00:29:42: Wir nehmen dann mal an, im Szenario,

00:29:44: dass jetzt gerade der SMTP-Server nicht erreichbar ist,

00:29:46: um die E-Mail zu versenden.

00:29:48: Dann gibt es einen Fehler und der Job in der Queue failt.

00:29:51: Und dann kann man dem zum Beispiel sagen,

00:29:53: hör mal, versuch das nochmal in zwei Minuten.

00:29:56: Und idealerweise ist in den zwei Minuten

00:29:58: dann der Service wieder da.

00:29:59: Und dann wird einfach derselbe Job nochmal ausgeführt

00:30:02: und der Nutzer bekommt dann letzten Endes doch seine E-Mail.

00:30:05: Und das ist einfach ein total mächtiges Tool,

00:30:07: um zum einen die Last so ein bisschen kontrollieren,

00:30:09: zu verteilen und aber auch mit so Error-States umzugehen.

00:30:12: Also wir machen jetzt relativ viel bei so einem Projekt,

00:30:14: wo viel im Hintergrund läuft mit Datensynchronisierung.

00:30:17: Und da habe ich wirklich für jeden Datenblock so einen eigenen Job

00:30:21: und der spawnt dann noch mehr Jobs und noch mehr Jobs

00:30:23: und die sind alle so ein bisschen in sich gekapselt.

00:30:26: Und dadurch ist eben ganz viel Last im Hintergrund versteckt

00:30:30: und lässt die eigentliche Anwendung frei

00:30:32: für den normalen HTTP-Verkehr.

00:30:35: Das sieht man auch ganz oft in externen Anwendungen,

00:30:38: also die jetzt gar nicht unbedingt mit Laravel geschrieben sind,

00:30:41: dass man dann, wenn man sich zum Beispiel so einen PDF-Export zieht

00:30:44: oder so, dass dann geschrieben wird,

00:30:46: hier, wir beachtigen dich, wenn das Ding fertig ist.

00:30:48: Und das geht so auf ein ähnliches Konzept dann zurück.

00:30:51: Genau. Du willst natürlich auch ein bisschen,

00:30:54: also das ist so ein ganz pragmatisches Beispiel,

00:30:56: deine HTTP-Requests kurz halten,

00:30:59: damit die nicht in so Endlos-Fehler reinlaufen.

00:31:02: Und diesen Jobs, den kannst du dann schon mal

00:31:04: ein bisschen mehr Laufzeit gönnen,

00:31:06: weil da eben so ein dauerhafter Prozess hinter ist.

00:31:07: Ein super mächtiges Tool.

00:31:09: Ich bin total begeistert, je mehr ich mich damit beschäftige.

00:31:12: Und wie viele Dinge man dann doch damit abbilden kann,

00:31:14: ist schon echt cool.

00:31:16: Macht allerdings auch das Deployment ein bisschen umständlicher

00:31:19: als Teaser für einen nächsten Punkt.

00:31:22: Oh, das Deployment. Kay, wollen wir das Thema heute aufrollen?

00:31:25: Ich würde es zumindest kurz mal anschneiden,

00:31:28: weil das ist bei so einer Laravel-Anwendung

00:31:31: ja, also nicht so einfach wie jetzt bei so einer klassischen Webseite,

00:31:37: so einem Wordpress-Ding, was man einfach rein tut und dann läuft das.

00:31:42: Ja, ich würde sogar sagen, es ist eigentlich sehr einfach.

00:31:45: Du kannst auch für die Dateien kopieren.

00:31:47: Aber wenn man es geil machen will, dann ist es sehr kompliziert.

00:31:50: Oder sehr kompliziert ist auch Quatsch,

00:31:52: aber man muss so die richtigen Tools dann haben.

00:31:54: Ja, genau. Das Deployment habe ich für mich so in drei Entwicklungs-Stages eingeteilt.

00:32:02: Man fängt wahrscheinlich auf der untersten an

00:32:04: und arbeitet sich dann so da hoch, je nachdem, welche Kompetenz man selber hat.

00:32:06: Also ist es eine Art Erfahrungslevel.

00:32:10: Und das unterste ist wirklich einfach so ein FTP-Verzeichnis wie bei Wordpress.

00:32:14: Da schiebe ich die Sachen hoch, pack meine Datenbank hinten dran

00:32:17: und dann läuft das Wordpress.

00:32:19: Bei einer Laravel-Anwendung ist das schon nicht so einfach.

00:32:23: Dieses Vendor-Verzeichnis in Laravel, wo die ganzen globalen Pakete drin installiert werden,

00:32:29: die man so am Rande braucht, damit die Anwendung läuft.

00:32:32: Das wird einfach ein unfassbar großes Verzeichnis, wenn das Projekt wächst.

00:32:35: Und das jedes Mal per FTP zu verschieben, das dauert einfach super lange

00:32:40: und ist dann auch fehleranfällig.

00:32:42: Dann läuft das eine Stunde lang, weil das viele Dateien sind

00:32:45: und dann bei einer Datei ist irgendein Schluck auf

00:32:47: und die Datei auf dem Zielserver ist nicht ganz richtig

00:32:50: und schon ist das ganze Ding kaputt.

00:32:52: Abgesehen davon, dass dann auch dieses ganze Deployment einfach relativ lange dauert.

00:32:57: Das kann man wirklich nur für die allereinfachsten Anwendungen machen,

00:33:01: wo nicht so viel los ist und wo man das gut kontrollieren kann.

00:33:03: Ja, du kannst natürlich auch so ein Vendor-Verzeichnis machen,

00:33:04: wo man nur die veränderten Dateien rüberschieben kann.

00:33:07: Da gibt es schon Möglichkeiten, habe ich auch schon in Setups gesehen,

00:33:10: die gut funktionieren.

00:33:11: Aber nichtsdestotrotz ist es nicht das, was man machen will.

00:33:14: Ja, genau.

00:33:16: Und wenn man dann anfängt, mit noch so Scheduler zu arbeiten,

00:33:19: also regelmäßig ausgeführte Jobs,

00:33:22: dann muss man das irgendwie über einen Crown-Job machen.

00:33:25: Dann braucht man dafür schon Berechtigungen auf dem FTP-Server.

00:33:28: Und bei sowas, wie ich gerade geschildert habe, mit der Queue, die dann parallel läuft,

00:33:31: das kannst du dann schon ganz vergessen.

00:33:33: Der nächste logische Schritt ist dann einfach ein Hardware-Server,

00:33:38: den man irgendwo hat, auf dem man auch Root-Rechte hat, um alles zu machen.

00:33:41: Da hat man dann schon ein bisschen mehr Möglichkeiten.

00:33:43: Das ist, glaube ich, so der zugänglichste Weg.

00:33:46: Man muss dann zwar einmal den Server richtig konfigurieren,

00:33:49: dass er die richtige PHP-Version hat und dass man da vielleicht so einen Crown-Job einrichtet.

00:33:53: Aber dann kann man da relativ einfach über Git sich so ein Projekt ziehen.

00:33:58: Auch nur die Differenzen dann, das geht relativ schnell.

00:34:01: Über Composer die Sachen installieren.

00:34:02: Die Sachen installieren lokal, ohne dass man sie per FTP irgendwie hin und her schieben muss.

00:34:06: Geht dann auch relativ schnell.

00:34:08: Also da ist man dann schon sehr schnell bei einem stabilen Setup.

00:34:11: Und so Dienste wie zum Beispiel Laravel, Forge,

00:34:14: die machen es einem ja noch einfacher bei dieser ganzen Provisionierung.

00:34:18: Da würde ich natürlich dann direkt einwerfen, dass viele Leute ja dann entwickeln wollen,

00:34:23: nicht unbedingt DevOps sein wollen und Administratoren sein wollen.

00:34:26: Und dann dafür zu sorgen, dass der Server auch sicher bleibt, aktuell bleibt und so weiter.

00:34:30: Das ist natürlich was, was nicht immer so gut funktioniert.

00:34:31: Das ist natürlich was, was nicht unbedingt jeder leisten kann oder will.

00:34:34: Wir hatten jetzt in der Vergangenheit oft das Glück, dass wir große Anwendungen gemacht haben,

00:34:38: wo dann wirklich Teams dahinter waren, die auch die Server administriert haben

00:34:41: oder irgendwie ein Kontakt in ein Rechtszentrum jedenfalls, wo wir dann genau sagen konnten,

00:34:44: dies und das brauchen wir und stellen uns das mal hin.

00:34:47: Und dann geht das natürlich alles.

00:34:49: Aber es gibt glaube ich noch bessere Wege.

00:34:51: Ja genau, also dieser klassische FTP-Beispiel, was mein erstes Stadium war,

00:34:57: das habe ich so ein bisschen aus diesem Managed Server abgeleitet, den wir bei Hetzner haben.

00:35:00: Da kauft man sich also einen gewarteten Server ein, der von Hetzner selber organisiert wird.

00:35:06: Da muss man sich dann keine Sorgen um Server-Updates machen oder Firewall-Einstellungen oder sonst irgendwas.

00:35:11: Der wird auch überwacht von denen.

00:35:13: Aber dafür geben die einem natürlich nicht so viele Rechte, was man auf dem Server anstellen kann.

00:35:18: Und aus eigener Erfahrung wissen wir, je größer die Laravel-Anwendung dann wird

00:35:23: und man zum Beispiel mit einer Queue startet, kommt man dann sehr schnell an die Bereiche,

00:35:27: wo jetzt Hetzner in diesem Fall vorbeikommt.

00:35:28: Wo jetzt Hetzner in diesem Fall vorbeikommt.

00:35:29: Wo jetzt Hetzner in diesem Fall vorbeikommt.

00:35:30: Wo jetzt Hetzner in diesem Fall vorbeikommt.

00:35:31: Wo jetzt Hetzner in diesem Fall vorbeikommt.

00:35:32: Und dann in diesem Fall sagt, okay, das hier ist der Managed Garden, den wir dir zum Spielen geben.

00:35:35: Raus kommst du nicht und das fällt dann natürlich schwer.

00:35:37: Und der nächste Schritt, wie du es gesagt hast, mit dem eigenen Server,

00:35:39: da haben wir selber dann mehr Möglichkeiten, um das Deployment zu vereinfachen.

00:35:44: Aber das ist natürlich auch sehr gefahrenbehaftet und man muss schon wissen, was man tut.

00:35:48: Und schon so ein bisschen in die DevOps-Rolle rein.

00:35:50: Nicht nur, um das Deployment sauber auf die Kette zu bekommen,

00:35:53: sondern, was du auch gesagt hast, dafür zu sorgen, dass der Server sicher ist.

00:35:57: Also Firewall richtig einrichten.

00:35:58: SSH-Verbindungen vielleicht nur keybasiert.

00:36:02: Und dann auch so sich um die basicsten Updates kümmern von den ganzen Tools, die darauf laufen.

00:36:07: Und der Königsweg, möchte ich es jetzt mal ganz biased formulieren,

00:36:12: ist dann eben in einer dockerisierten Umgebung.

00:36:17: Da ist das Stichwort schon.

00:36:18: Weil bei den beiden vorherigen Stages ist immer das Problem,

00:36:22: dass da irgendwo draußen ein Server läuft mit einer PHP-Version.

00:36:27: Das heißt, da ist dann irgendwo ein Serverlauf mit einer PHP-Version.

00:36:28: Und dort schiebe ich Dinge hin, die ich bei mir lokal entwickelt habe.

00:36:32: Da kommt dieses klassische Meme rein,

00:36:35: It worked on my machine.

00:36:36: Ich habe also bei mir lokal was entwickelt mit der richtigen lokalen PHP-Version,

00:36:40: mit den richtigen PHP-Erweiterungen installiert.

00:36:43: Und was weiß ich nicht noch, was für Späße dazukommen.

00:36:45: Ich pack das alles auf den Remote-Server und dann fliegt es in die Luft,

00:36:49: weil die PHP-Version eine Stufe zurück ist

00:36:52: oder irgendwelche Erweiterungen nicht installiert sind oder solche Späße.

00:36:56: Und dann muss ich dann,

00:36:57: wie so eine Operation am offenen Herzen,

00:37:00: gucken, dass ich das wieder gefixt bekomme.

00:37:02: Das ist sowohl bei der ersten PHP-Variante

00:37:05: als auch bei diesem, tja, SSH-Server, habe ich es mal genannt, ein Problem,

00:37:11: was uns tatsächlich regelmäßig auf die Füße fällt,

00:37:14: weil dann übersieht man doch mal Sachen.

00:37:16: Und die Lösung dafür ist eine containerisierte Anwendung.

00:37:21: Also Stichwort Docker.

00:37:22: Ich habe als Produkt ein Docker-Image

00:37:25: oder vielleicht über so einen,

00:37:26: Compose-File mehrere Docker-Image,

00:37:30: die irgendwie zusammenspielen

00:37:32: und dann einen Container, wo die App draufläuft,

00:37:35: also für die HTTP-Requests einen Container,

00:37:39: wo die Anwendung draufläuft mit einem Queue-Worker,

00:37:43: nochmal eine mit einem Scheduler

00:37:45: und was weiß ich nicht noch für Späße.

00:37:47: Und dann deploye ich einfach nur in allergrößten Anführungszeichen

00:37:51: die fertig gebauten Images und dieses Compose-File irgendwo hin,

00:37:55: auf Kubernetes oder Docker-Swarm geht auch immer noch ganz gut.

00:38:00: Und ich kann zumindest sicher sein,

00:38:02: dass meine Anwendung total gut funktioniert,

00:38:04: weil es dasselbe Image ist, was ich da ausspiele.

00:38:06: Ich konnte es bei mir lokal testen.

00:38:07: Ich konnte es in der Pipeline bauen und testen

00:38:09: und ich werde niemals das Problem haben,

00:38:11: dass in der Live-Umgebung auf einmal eine andere Docker-Version installiert ist,

00:38:15: als ich persönlich habe.

00:38:17: Aber auch da ist dann wieder das Problem,

00:38:19: gut, wer stellt mir denn den Server mit dem Docker-Daemon hin

00:38:22: und auch dann muss ich ein Deployment machen.

00:38:24: Also so richtig einfacher macht es das Ganze nicht

00:38:27: und jetzt will ich gar nicht von Kubernetes

00:38:29: oder so großen Orchestrierungslösungen anfangen.

00:38:31: Genau, also hat man bestenfalls jemanden, der sich damit auskennt.

00:38:34: Ich glaube Laravel Cloud ist ein Service von Laravel,

00:38:37: vielleicht selbst, weiß ich gar nicht,

00:38:39: die sowas zumindest in der Richtung anbieten

00:38:42: und das ein bisschen einfacher machen wollen.

00:38:44: Ja, genau.

00:38:45: Also da ist die Idee auch so ein bisschen,

00:38:47: du klickst dir auf so eine ganz fancy UI-Oberfläche zusammen,

00:38:51: welche Dienste du so brauchst.

00:38:53: Und im Hintergrund wird dann AWS bemüht

00:38:55: und da werden zig verschiedene Dinge gepackt.

00:38:57: Aber da ist dann wieder das Problem mit AWS im Hintergrund,

00:39:00: das wird dann sehr schnell sehr teuer,

00:39:02: weil du dann für jeden Dienst, den du hochfahren musst,

00:39:06: da eine eigene Münze einwerfen musst.

00:39:08: Also so oder so ist Deployment teuer.

00:39:12: Die Frage ist, an welcher Stelle die Kosten entstehen,

00:39:15: ob ich sie im Monat auf der Rechnung von Hetzner oder AWS

00:39:19: oder sonst wem bezahle

00:39:20: oder ob ich es in Stundenreihen packen kann,

00:39:22: um da irgendwie das Deployment selbst zu organisieren

00:39:25: und mir da selber Lösungen zu programmieren.

00:39:27: Und um diesen Wust ein bisschen aufzuräumen,

00:39:29: wir benutzen ja in einigen kleinen Projekten Laravel Forge

00:39:34: und hängen da einfach so kleine Hetzner-Server ein,

00:39:38: wo die Anwendung dann deployed wird.

00:39:40: Das ist jetzt nicht containerisiert.

00:39:42: Funktioniert aber im Wesentlichen wirklich schon ziemlich cool

00:39:46: und sehr einfach aufzusetzen

00:39:48: und ist von Kosten auch sehr überschaubar.

00:39:50: Vor allem sind es keine Kosten,

00:39:51: keine variablen Kosten,

00:39:52: sondern du weißt direkt, was du bezahlst.

00:39:54: Darfst mich gleich gerne korrigieren.

00:39:56: Alles richtig.

00:39:57: Und in den großen Anwendungen,

00:39:58: da haben wir dann eben Teams,

00:40:00: die uns Server zur Verfügung stellen,

00:40:01: wo wir einfach nur einen Docker-Container hinschicken

00:40:03: und die organisieren,

00:40:05: dass das Ding vernünftig läuft.

00:40:07: Und das ist natürlich für uns die liebste Variante,

00:40:09: weil wir nicht unbedingt DevOps sein wollen.

00:40:11: Das eben nur im Notfall ist jetzt zu wild gesagt,

00:40:15: aber also wenn es jemand von uns machen kann,

00:40:17: dann geben wir es gerne ab.

00:40:19: Genau so ist das.

00:40:20: Felix, jetzt darfst du dir noch aussuchen,

00:40:22: ob wir noch über ein paar Pakete sprechen,

00:40:24: die immer wieder bei uns zum Einsatz kommen,

00:40:27: wir über Blade und so ein bisschen das Frontend-Thema sprechen

00:40:32: oder vielleicht sogar am Ende eine kleine Aussicht geben

00:40:35: über die Weiterentwicklung.

00:40:37: Ja, ich glaube, die beiden ersten Sachen sind ganz wichtig,

00:40:39: weil ich denke, dass das Leute, die in Laravel einsteigen

00:40:42: oder vielleicht auch Leute,

00:40:44: die mit Laravel schon länger gearbeitet haben,

00:40:45: ganz interessant finden könnten,

00:40:47: was wir so für Packages nutzen

00:40:49: und für Erweiterungen,

00:40:51: wie wir so dieses Ökosystem für uns erweitern.

00:40:53: Das ist interessant.

00:40:55: Und dann, Stichwort Frontend slash Blade,

00:40:58: da haben wir ja mitunter auch so einen eigenen Weg

00:41:01: und da würde ich schon gerne auch kurz drauf eingehen.

00:41:04: Sollen wir mit den Packages einfach mal anfangen?

00:41:07: Gerne.

00:41:08: Also ich habe mich einfach mal hingesetzt

00:41:09: und so ein bisschen zusammengetragen,

00:41:11: was so die häufigsten Pakete sind,

00:41:13: die wir in unseren Anwendungen einsetzen

00:41:16: und auch für die größten Pain Points,

00:41:18: die es so gibt.

00:41:19: Und da möchte ich ganz vorne an prominenter Stelle

00:41:22: selbstverständlich die großartigen Kollegen von Spatie, Spati?

00:41:28: Ich wusste, dass es dazu kommt,

00:41:29: dass wir es aussprechen müssen.

00:41:30: Ich habe auch keine Ahnung.

00:41:31: Ich würde es, Spati?

00:41:32: Keine Ahnung.

00:41:33: Es ist, glaube ich, eine belgische Agentur auch,

00:41:36: die unendlich viele,

00:41:38: insbesondere Laravel-basierte Packages rausbringen.

00:41:41: Also für alle möglichen Sachen wirst du bei denen fündig.

00:41:44: Die Sachen sind super dokumentiert,

00:41:46: funktionieren fantastisch.

00:41:47: Es ist einfach ein großer Segen für die Community,

00:41:50: dass es die gibt.

00:41:51: Und an prominentester Stelle von denen

00:41:53: ist das Laravel Permissions Package.

00:41:56: Und das tut schon, was es verspricht,

00:41:58: nämlich es beschäftigt sich um die Berechtigungen

00:42:01: und macht dieses ganze Rollen- und Permissions-Konzept

00:42:05: ein bisschen besser greifbar.

00:42:07: Die Idee da ganz kurz ist,

00:42:09: dass man eben alle Dinge, die man in der Anwendung tut,

00:42:11: an Permissions festmacht

00:42:13: und Gruppen dann Gruppierungen von Permissions gibt,

00:42:16: und diese Gruppen wiederum werden einzelnen Nutzern zugeteilt.

00:42:20: Also selten, dass dann ein Nutzer

00:42:22: einen bestimmten Set von Permission gibt,

00:42:24: sondern die Permissions werden über die Gruppen gebündelt

00:42:27: und Gruppen bekommen die User, außer vielleicht der Admin.

00:42:30: Da kann man noch so ein bisschen was vorschalten,

00:42:32: dass der immer alles darf.

00:42:33: Das Wichtigste ist, alles an Permissions festmachen

00:42:37: und niemals irgendwie die Rolle abfragen oder sowas.

00:42:40: Das gibt nur Chaos.

00:42:41: Ich hatte letztens vom Kunden wieder eine Anfrage,

00:42:43: der sagte, hier, ich will einen speziellen User,

00:42:45: der soll ein bestimmtes Admin-Panel sehen.

00:42:48: Und da habe ich gesagt, ja, wir können das dem User zuweisen,

00:42:50: wir werden das aber technisch nicht über den User lösen,

00:42:53: dass der eine Berechtigung hat,

00:42:55: sondern wir werden dem eine eigene Gruppe geben

00:42:57: oder eine Gruppe zusätzlich hinzufügen,

00:42:59: dass der eben dieses Recht dazu kriegt.

00:43:01: Und ja, das machen diese Laravel-Permissions eigentlich perfekt.

00:43:04: Und ich kenne aber ehrlich gesagt auch keinen,

00:43:06: der das Package nicht einsetzt.

00:43:08: Ja, ich auch nicht.

00:43:09: Also es gibt natürlich auch andere Packages,

00:43:11: die das gleiche Konzept ungefähr abbilden.

00:43:13: Da ist jetzt Sparty.

00:43:15: Die Laravel-Permissions einfach so das naheliegendste für uns gewesen,

00:43:18: weil es, glaube ich, auch das bekannteste in dem Bereich ist.

00:43:21: Aber Hauptsache nicht selber machen

00:43:23: und Hauptsache nicht selber irgendwie so ein Rollensystem nachbauen.

00:43:27: Das hat uns lange Zeit gekostet, das selber zu refactoren.

00:43:31: Was ich am zweitwichtigsten schon fast finde,

00:43:33: was bei vielen Leuten so ein bisschen untergeht,

00:43:36: ist ein Package namens Owen It.

00:43:38: Und die haben ein Laravel Auditing Package.

00:43:41: Und das tut genau das auch, was es beschreibt,

00:43:45: nämlich es auditiert die Models.

00:43:48: Und was damit gemeint ist,

00:43:49: dass immer wenn eine Änderung an einem Model passiert,

00:43:52: dass es dafür dann einen entsprechenden Log-Eintrag gibt irgendwo,

00:43:55: der beschreibt, wie es vorher aussah und wie es nachher aussah.

00:43:58: Und da denkt man so in der Entwicklung gar nicht dran,

00:44:01: ach hier ist doch klar, ich habe immer den Ist-Zustand.

00:44:03: Aber wie oft es schon vorgekommen ist,

00:44:05: dass der Kunde im Nachhinein zu mir gekommen ist und gesagt hat,

00:44:09: hey hier, schau mal, da ist ein Fehler,

00:44:11: da ist das auf einmal, da ist das auf einmal,

00:44:13: eure Anwendung ist kaputt, macht das mal halt.

00:44:15: Und ich habe dann die Anwendung dann auch so geteilt.

00:44:17: Durch dieses Auditing konnte ich dann nachweisen,

00:44:19: nee, schau mal hier, zu diesem Zeitpunkt wurde dieses Model so und so verändert,

00:44:22: das war der Auslöser und ich kann das dann einfach viel besser nachvollziehen,

00:44:26: wie sich insbesondere Daten über die Zeit verändern,

00:44:29: statt immer nur in der Datenbank die Momentaufnahme zu haben.

00:44:32: Und das ist für die Entwicklung total irrelevant.

00:44:35: Aber wenn so eine Anwendung dann einmal läuft und sich die Daten verändern,

00:44:38: ist es unfassbar wertvoll, im Nachhinein nachvollziehen zu können,

00:44:42: wie sich Dinge verändert haben.

00:44:44: Dann, was habe ich hier noch in der Liste?

00:44:47: Laravel Data, auch von den Sparti-Kollegen.

00:44:50: Das setzt das Konzept des DTOs um, also Data Transfer Object.

00:44:55: Und das ist auch ein sehr mächtiges Konzept, wenn es darum geht,

00:44:59: Daten innerhalb der Anwendung hin und her zu schieben,

00:45:02: die aber noch kein Model sind.

00:45:05: Also klassisch wäre eine Gruppe von Informationen,

00:45:10: die ich aus einem Request bekomme.

00:45:12: Die packe ich erstmal in so ein DTO,

00:45:14: und dann habe ich ein schönes Objekt,

00:45:16: was ich durch die Gegend schieben kann.

00:45:18: Und dieses DTO Package kann das dann automatisch aus dem Request ableiten

00:45:21: und automatisch ins Model reinschreiben.

00:45:24: Und es ist einfach ein sehr schöner Helfer,

00:45:26: wenn ich mit Daten agiere, die noch kein Model sind

00:45:30: oder aus irgendwelchen Gründen keine Models sein können.

00:45:33: Wir haben noch Filament.

00:45:35: Das ist so ein Admin Panel.

00:45:37: Da kann man nur mit Code sehr schnell so einen Administrationsbereich zusammensetzen.

00:45:42: Mit eigenen Seiten, mit den ganzen Ressourcen, die aufgelistet werden.

00:45:49: Und dort sehr schnell so klassische CRUD-Abbildungen machen.

00:45:53: Einfach, wie ich schon sagte, für so einen Adminbereich,

00:45:55: um da sehr schnell Dinge zu prototypen.

00:45:57: Und das geht wirklich sehr gut.

00:45:59: Man hat da auch sehr viele Freiheiten,

00:46:01: ein bisschen erschlagen viele Freiheiten,

00:46:03: wenn man da neu reinkommt.

00:46:05: Aber man kann eigentlich schon fast ganze Anwendungen auf diesem Filament bauen.

00:46:08: Nicht nur, wenn es für die Admins ist.

00:46:10: Also da kriegt man sehr schnell starke UIs hin,

00:46:14: die dann ein bisschen opinionated aussehen nach diesem Filament.

00:46:17: Aber da kriegt man sehr schnell Ergebnisse mit hin.

00:46:20: PHP Spreadsheets haben wir noch von PHP Office.

00:46:24: Das ist so ein Helfer.

00:46:25: Den hast du, glaube ich, insbesondere eingebracht,

00:46:28: wenn man irgendwelche fancy Exporte schreiben muss für den Kunden,

00:46:33: die auch mit so Excel-Spezialitäten umgehen.

00:46:36: Also vielleicht schon irgendwelche Formeln eingebrannt haben und solche Späße.

00:46:39: Dafür ist das sehr hilfreich.

00:46:41: Man konnte es auch sehr gut ausleiten und sehr gut programmieren.

00:46:44: Ich glaube, da kannst du vielleicht eher was zu sagen, wenn du dich erinnerst.

00:46:47: Ja, glaube ich, können wir so stehen lassen,

00:46:49: weil wir können ja jetzt über alle Packages irre viel sprechen.

00:46:52: Ich habe hier so eine Liste auch vor mir und denke,

00:46:55: das können wir niemals hier im Podcast alles anbringen.

00:46:58: Aber die, die uns so am wichtigsten sind, können wir natürlich kurz eben anreißen.

00:47:01: Genau.

00:47:02: Wo ich jetzt wünschte, ein wunderbares, einfaches und perfektes Paket für benennen zu können,

00:47:08: ist zum Generieren von PDFs, Felix.

00:47:12: Und da sprechen viele Jahre des Pains aus mir.

00:47:19: Das ist einfach nicht so geil.

00:47:22: Das ist aber nicht nur in Laravel nicht geil, das ist in PHP überhaupt nicht geil.

00:47:26: Genau. Also das ist so ein grundsätzliches Problem, was daraus resultiert,

00:47:30: dass du eigentlich ja immer irgendein fancy UI, was im Web schon gut funktioniert,

00:47:36: aber auch in der Web schon gut funktioniert,

00:47:37: auf eine PDF brennen willst.

00:47:40: Aber damit es im Web super gut aussieht,

00:47:43: hast du sehr neue Features mit CSS und JavaScript,

00:47:47: die da agieren und irgendwelche Diagramme zeichnen oder weiß ich nicht was für Späße.

00:47:51: Und die kannst du halt nicht einfach so mit PHP in eine PDF reinbrennen.

00:47:57: Es gibt viele verschiedene Packages, die einem da so ein bisschen was erlauben,

00:47:59: mit auch verschiedenen Ansätzen,

00:48:02: dass du zum Beispiel schon eine Template-PDF hast,

00:48:05: die du nur an bestimmten Bestellen brichst.

00:48:07: Oder du schreibst, das geht relativ einfach.

00:48:09: Es gibt auch andere Packages, die einem da so ein bisschen mehr Gestaltungsmöglichkeiten erlauben.

00:48:14: Aber in dem optischen Umfang, den wir haben wollen, haben wir nichts gefunden.

00:48:18: Und was jetzt bei uns eine Lösung ist, die ist aber auch alles andere als ideal,

00:48:23: ist, dass wir einen eigenen Container haben, wo so eine Puppeteer-Instanz drin läuft.

00:48:27: Dem schicken wir ein HTML-Template, der rendert das in einem mehr oder weniger echten Browser,

00:48:32: macht davon einen Screenshot und packt das in die PDF.

00:48:36: Oder hört man schon, da kann viel schiefgehen.

00:48:39: Aber dafür, wenn es funktioniert, hat man dafür auch eine perfekte gerenderte PDF,

00:48:43: weil dadurch, dass da ein echter Browser im Hintergrund läuft,

00:48:46: der alle möglichen JavaScript-Features ausnutzen kann,

00:48:49: uns die allerfancysten Diagramme zeichnet und weiß ich nicht was.

00:48:53: Aber bis das mal gestanden hat, das war ein harter Weg.

00:48:56: Und ich möchte es auch ungern nochmal anfassen.

00:48:59: Sieht aber sehr schick aus, muss ich sagen. Also richtig cool.

00:49:02: Hat aber mit dem Laravel-Package jetzt erstmal nicht viel zu tun, ne?

00:49:04: Ja, genau. Aber jeder, der mal so ein bisschen mehr mit dem Lavavel-Package arbeitet,

00:49:05: kommt früher oder später dahin, dass der Kunde fragt,

00:49:08: ja, was ist denn mit so einem PDF? Hätte ich auch mal gerne.

00:49:12: Und wie oft ich schon dachte, ja, das muss doch gehen.

00:49:15: Und wie oft ich dann festgestellt habe, ja, so einfach ist das nicht.

00:49:18: Hast du noch Pakete, die du ganz wichtig findest?

00:49:22: Sonst hätte ich noch mindestens eins.

00:49:24: Oh, nee, ich bin mit meiner Liste durch. Jetzt bin ich gespannt, was du noch hast.

00:49:27: Was ich super gerne genutzt habe, ist Laravel Dusk.

00:49:30: Sagt dir das was? Diese Browser-Testing?

00:49:33: Ja.

00:49:34: Und das fand ich super cool, weil man damit ja so automatisiertes Browser-Testing machen kann

00:49:37: und sagen kann, hier, klick mal den Button an und guck mal, ob sich die Seite innerhalb einer bestimmten Zeit öffnet

00:49:42: und ob dann eine bestimmte Nachricht da draufsteht.

00:49:44: Und das fand ich irgendwie total cool zu coden, intuitiv.

00:49:49: Und ich habe das super gerne mal genutzt in den Projekten, wo ich das eingesetzt habe.

00:49:52: Mhm, gute Ergänzung, ja.

00:49:53: Jetzt bist du natürlich eher so der Unit-Tester und das setzt natürlich eine Ebene höher an.

00:49:58: Aber das fand ich trotzdem immer ganz cool.

00:50:00: Oh, da gehen wir jetzt nochmal ganz tief ins Thema Testing rein.

00:50:02: Aber ich stimme dir auf jeden Fall zu, dass das, was du jetzt schon gesagt hast,

00:50:03: ich stimme dir auf jeden Fall zu, dass es dafür seine Berechtigung gibt.

00:50:06: Und das ist eine gute Implementierung von diesem Ende-zu-Ende-Testing-Konzept.

00:50:10: Soll ich jetzt nochmal über Frontends ranten, Felix?

00:50:13: Mach das gerne. Ich habe da auch noch einen Input.

00:50:16: Und zwar ist ja in Laravel, was ist jetzt die aktuellste Version? 12?

00:50:20: Die an meinem Geburtstag rausgekommen ist.

00:50:22: Seitdem gibt es ja so Starter-Kits für Vue, React und so weiter.

00:50:25: Und die nutzen ja, glaube ich, ich weiß gar nicht, irgendwie, wird das in einem Satz mit Tailwind genannt

00:50:31: und diesem Schätz-Test.

00:50:33: Wo ich auch nicht weiß, wie man das ausspricht.

00:50:35: Und Inertia.

00:50:37: Und ich habe keine Ahnung davon, weil ich es noch nicht verwendet habe.

00:50:39: Aber du hast dich bestimmt damit beschäftigt.

00:50:41: Da würde mich mal interessieren, macht das alles besser?

00:50:44: So.

00:50:47: Herzlich willkommen zur zweiten Hälfte dieses Podcasts.

00:50:50: Ich hoffe, sie haben noch drei Stunden mitgebracht.

00:50:52: Diese Starter-Kits nutze ich oder wir persönlich nicht,

00:50:56: weil die eben schon sehr opinionated sind, wie man schon sagt.

00:50:59: Also du hast es gerade gesagt, die setzen stark auf Tailwind.

00:51:01: Also du hast es gerade gesagt, die setzen stark auf Tailwind.

00:51:02: Also du hast es gerade gesagt, die setzen stark auf Tailwind.

00:51:04: Was durchaus verbreitet ist, aber wir eben nicht einsetzen.

00:51:06: Die haben schon ihre eigenen Ideen darüber, wie das mit diesen ganzen Komponenten funktioniert und sowas.

00:51:12: Und ehrlicherweise kriegt man damit auch sehr schnell Ergebnisse.

00:51:16: Ich habe nur festgestellt, dass ich dann häufiger Dinge wieder zurückgebaut habe,

00:51:21: als mir das Starter-Kit gebracht hat.

00:51:23: Die haben dann auch schon Administrationsseiten oder beziehungsweise so Settings-Seiten,

00:51:27: wo man sein eigenes Profil bearbeiten kann und zwei Faktor-Authentifizierung machen kann und sowas.

00:51:31: wo man sein eigenes Profil bearbeiten kann und zwei Faktor-Authentifizierung machen kann und sowas.

00:51:32: Also das ist schon sehr mächtig, wenn man das als kompletten Startpunkt nehmen möchte,

00:51:36: um darauf eine Anwendung zu bauen.

00:51:38: Wir haben bis jetzt immer gesagt, okay, wir haben da eigene Ideen, wie wir irgendwas machen möchten.

00:51:42: Deswegen haben wir es gleich mit nativem Laravel gemacht, sag ich jetzt mal,

00:51:47: und darauf die Sachen gebaut, die wir brauchen.

00:51:49: Das, was wir immer machen, ist, dass wir, oder wir verwenden am liebsten React Frontends

00:51:55: und sprechen dann über eine REST-API meistens mit Laravel und haben eben Laravel im Backend,

00:52:00: weil das für uns so...

00:52:01: weil das für uns so...

00:52:02: weil das für uns so...

00:52:03: Also, wenn man sagt, dass wir die besten beiden Welten kombiniert sind,

00:52:04: klassischerweise würde man ja ein Laravel-Frontend mit Blade bauen,

00:52:08: also über diese Blade-Templates letztlich ganz normale HTML-Seiten rausspucken.

00:52:12: Und für uns funktioniert eben diese Kombination aus React und Laravel ganz cool,

00:52:16: mit Nachteilen, die es auch hat, aber eben auch vielen Vorteilen.

00:52:19: Genau, und das Setup aber aufzusetzen, ist jetzt von Laravel nicht unbedingt direkt so vorgegeben,

00:52:24: wenn man jetzt nicht diese Starter-Kits so verwenden will, wie sie dann sind.

00:52:27: Ja, es gibt auch so API-Starter-Kits, wo dann schon Sanctum installiert ist,

00:52:30: und das finde ich noch am ehesten gut.

00:52:31: Ich finde einfach Blade blöd.

00:52:35: Und das hat nichts mit Blade an sich zu tun.

00:52:37: Ich finde auch alle anderen serverseitigen Template-Variationen, die es so gibt,

00:52:41: also Twig, oder jetzt habe ich sie schon wieder alle vergessen, wie sie heißen,

00:52:45: die haben nämlich alle das... zwei große Probleme.

00:52:49: Das eine ist, dass sie alle ihr eigenes Süppchen backen, was die Syntax angeht,

00:52:53: und deswegen erstmal nicht so richtig kompatibel sind,

00:52:56: und man darauf hoffen muss, dass die IDEs und sowas damit umgehen.

00:53:01: Das ist Blade zum Glück so verbreitet, dass es da ja inzwischen,

00:53:04: also alle Editoren damit umgehen können, auch wenn es kein klassisches HTML ist.

00:53:09: Das ist immer so ein bisschen das, was mich stört, dass da jeder so seine eigene Syntax ein bisschen erfindet,

00:53:15: und man jetzt nicht ohne weiteres Blade-Syntax in Twig reintun kann und sowas.

00:53:21: Das Größere, was mich aber stört, ist, dass da einfach die Entwicklungsexperience nicht so gut ist.

00:53:27: Die Idee bei diesen Blade-Templates,

00:53:29: oder bei Laravel generell, ist, dass ich ja im Controller sage,

00:53:32: welche Template ich aufrufe, und zwar über einen String,

00:53:35: und dann übergebe ich dem irgendwelche Parameter, die dann in dieses Blade-Template injiziert werden,

00:53:41: und in dem Blade-Template kann ich diese Variablen wieder aufgreifen und sie verwenden.

00:53:46: Aber ich weiß in dem Blade-Template nicht, welche Variablen ich an der anderen Stelle übergeben habe,

00:53:51: und es gibt auch technisch keine Möglichkeit, das dem Editor begreifbar zu machen,

00:53:56: und deswegen ist die einzige Möglichkeit,

00:53:58: dass ich bei jedem Blade-Template oben so einen Block reinmache, wo ich sage,

00:54:03: schau mal hier, verlass dich drauf, es gibt auf jeden Fall diese und diese Variablen mit diesen Typen,

00:54:09: aber es gibt, anders als bei TypeScript und React zum Beispiel, keine inhärente Logik, die das überwacht.

00:54:16: Ich kann dann entweder im Controller andere Variablen übergeben oder welche weglassen oder sowas,

00:54:21: und es gibt dann nicht so einen inhärenten Zusammenhang.

00:54:24: Und das finde ich immer noch ein bisschen abschreckend nach wie vor.

00:54:27: Plus, dass mir die Syntax nicht gefällt, aber das ist ja so ein bisschen individuelles Verschulden.

00:54:31: Das ist aber wie gesagt jetzt alles auch nicht auf Blade gemünzt,

00:54:34: sondern das haben alle anderen Template-Engines auch so, die mir untergekommen sind, im PHP-Bereich.

00:54:39: Und deswegen, wie du sagst, setzen wir eigentlich exklusiv Laravel nur so als Backend ein

00:54:46: und setzen dann unser eigenes, meistens React-Frontend, davor.

00:54:50: Wobei ich damit auch nicht so ganz zufrieden bin, können wir vielleicht mal noch eine Folge dazu machen.

00:54:54: Ja, ein riesen Vorteil ist ja auch, dass diese klassischen Blade-Dinger,

00:54:56: das sind halt keine Single-Page-Applications.

00:55:00: Also du lädst jede Seite ja normalerweise neu, gibt es auch Methoden und Wege,

00:55:04: aber wir wollen ja bestenfalls so eine Reactive, Responsive Font-Einwendung bauen,

00:55:10: die möglichst wenig Inhalte nachlädt, über APIs kommuniziert,

00:55:13: und das kriegst du halt mit einem Blade so zumindest im Standard nicht hin.

00:55:16: Jetzt haben wir lange ausgebreitet, warum wir aktuell mit großer Begeisterung Laravel einsetzen.

00:55:23: Jetzt ist die spannende Frage, machen wir das auch weiterhin?

00:55:26: Felix?

00:55:27: Ich denke schon.

00:55:29: Also das Einzige, was mir bei Laravel manchmal so ein bisschen Sorgen macht,

00:55:33: ist, dass das halt so ein riesen Ökosystem wird.

00:55:36: Und wenn man hier auf der Laravel-Website guckt und dann da nur die Laravel-eigenen Packages,

00:55:41: also die von Laravel promoten Packages, sich anguckt, das sind wahnsinnig viele,

00:55:45: also bestimmt schon ein Dutzend.

00:55:47: Ja, es wird immer größer und immer unübersichtlicher,

00:55:49: während das am Anfang ja eigentlich ziemlich greifbar war und überschaubar, was es so alles gab,

00:55:53: wächst dann natürlich sehr viel drum herum.

00:55:54: Das ist genauso vorteilhaft wie nachhaltig.

00:55:55: Nachteilhaft gibt es das Wort.

00:55:58: Jetzt schon.

00:55:59: Nachteilbehaftet.

00:56:00: Und das ist so das Einzige, wo ich so denke, wird das eben zu groß und überholt sich das eben von selbst

00:56:06: und kommt dann wieder irgendwas Kleines, Leichtgewichtiges, was ganz viel in sich schon komprimiert

00:56:12: und das dann in einen neuen Platz hier schwirrt.

00:56:14: Oder ist das eben ein riesen Vorteil, dass es so viel drum herum gibt?

00:56:17: Und dann gibt es natürlich noch ein paar Leute, die dann sagen, die Leute von Laravel,

00:56:20: die wollen natürlich auch Geld damit machen und bringen deshalb dann so Services wie Forge und sowas raus.

00:56:24: Die ohne Zweifel ganz cool sind.

00:56:27: Aber irgendwann kann natürlich auch mal ein Punkt kommen, wo man schlechter um diese Services rumkommen kann

00:56:31: und dann kann es so Open Source sein, wie man will.

00:56:34: Dann ist es, ja, hat es trotzdem so was von so einer proprietären Umgebung, wo man dann drin ist.

00:56:39: Das wären so die Sachen, wo ich Bedenken habe.

00:56:41: Aber an sich gefällt mir Laravel nach wie vor immer noch extrem gut.

00:56:44: Jetzt war ja vor kurzem die Laracon US für 2025, die ja so ein bisschen als Keynote, Aushänge, Konferenz,

00:56:52: benannt wird, wo auch immer der Tailor steht, der das Ganze erfunden hat und die neuesten Dinge verkündet.

00:57:01: Und die großen Announcements, die da gemacht wurden, waren Dinge für Laravel Cloud,

00:57:06: ein bezahlter Service zum Laravel Deployen, Laravel Forge, ein anderer bezahlter Service zum Deployen.

00:57:14: Laravel 12 hat jetzt Dinge mit AI und Nightwatch gibt es auch neue Dinge,

00:57:20: was auch ein bezahlter Service ist.

00:57:21: Was auch ein bezahlter Service von Laravel ist zum Error-Tracking und so was.

00:57:25: Also ich finde, da hat man sehr gut den aktuellen Fokus gesehen,

00:57:29: nämlich die wollen ihre eigenen bezahlten Systeme pushen und machen da bestimmt ganz großartige Neuerungen,

00:57:38: die man auch gut benutzen kann.

00:57:39: Wir benutzen ja Forge selber, aber man sieht schon, wo da der Fokus ist.

00:57:43: Das ist so ein bisschen die Gefahr, wie du gerade schon gesagt hast,

00:57:46: dass sie sich mehr auf die kommerziellen Aspekte konzentrieren

00:57:50: und so ein bisschen das Open Source machen.

00:57:51: Also man muss natürlich auch fairerweise sagen, niemand wird mit Open Source reich

00:57:57: und die Menschen stecken da sehr viel Zeit und sehr viel Energie rein

00:58:01: und haben ein großes Vollzeit-Team, was sich mit der Entwicklung von dem Open Source Laravel Framework beschäftigt.

00:58:08: Da finde ich es eigentlich gut, dass sie auf so einer transparenten und ehrlichen Art und Weise

00:58:13: das Geld auf anderer Seite reinholen, die wir dann opt-innen können, wenn wir wollen oder nicht.

00:58:19: Aber die Gefahr besteht natürlich, was du gerade gesagt hast, dass wir dann auch noch mal die ganze Zeit,

00:58:20: die wir jetzt haben, nicht mehr so genau wissen, was ist das eigentlich?

00:58:21: Und das ist ja auch so ein bisschen das Problem, dass man das eigentlich offene Laravel Framework

00:58:22: irgendwann nur noch in Kombination mit so einem Paid-Service benutzen kann.

00:58:23: Genau, während die Services selbst, also natürlich kann ich keinen Server kostenlos anbieten,

00:58:24: also dass das was kosten muss, ist gar nicht das Problem.

00:58:25: Das Problem ist eher genau wie du sagst, dass das einfach mit den eigenen Bordmitteln dann

00:58:28: so gut funktioniert oder vielleicht auch mit anderen wesentlich schlechter,

00:58:31: dass man dann irgendwann dazu ein bisschen gezwungen ist und wenn man in diesem Ökosystem erstmal drin ist,

00:58:32: dann kommt das einfach noch nicht so gut.

00:58:33: Das ist ja auch ein bisschen wie bei den anderen Bordmitteln.

00:58:34: Also ich glaube, dass man dann irgendwann dazu ein bisschen gezwungen ist,

00:58:35: wenn man in diesem Ökosystem erst mal drin ist,

00:58:50: dass man dann auch schlecht wieder rauskommt.

00:58:51: Jetzt muss man allerdings auch ehrlicherweise gestehen, wenn du mich jetzt fragst,

00:58:55: ja was sollen die denn noch entwickeln, was erwartest du denn noch?

00:58:58: Da sage ich ja keine Ahnung.

00:59:00: Also die Dokumentation ist 1000 Seiten lang für jedes Feature, das man sich nur vorstellen kann.

00:59:05: Gibt es da eine erschöpfende Auswahl von Möglichkeiten, wie man damit umgehen kann?

00:59:10: Und ich wüsste jetzt aus dem Stand nichts, wo ich sage,

00:59:13: boah, also dass sie das dieses Jahr nicht verkündet haben, das ist ja wirklich sträflich.

00:59:18: Und das ist glaube ich auch so ein Problem.

00:59:19: Und das ist glaube ich auch so ein bisschen das Ding,

00:59:21: dass sie eigentlich schon ein sehr fertiges Produkt haben

00:59:24: und jetzt nur verschlimmbessern können, sage ich mal vorsichtig.

00:59:29: Ja, ich fände halt cool, wenn die so ein paar Pakete, die jetzt extern sind,

00:59:32: also zum Beispiel von diesem Spati, diese Permissions,

00:59:35: wenn die da hingehen würden und das zu einem Laravel-eigenen Paket machen würden,

00:59:40: das fände ich irgendwie cool.

00:59:41: Oder wenn das Teil von Laravel wird, weiß ich jetzt nicht genau,

00:59:43: ob man das in Laravel direkt reinbringen will,

00:59:45: aber ich glaube, das wäre nicht mal die schlechteste Idee.

00:59:47: Und dass man sagt, man muss sich einfach mal ein bisschen mehr auf die Art und Weise kümmern,

00:59:48: weil man ja auch schon so ein bisschen mehr in die Art und Weise kümmern muss.

00:59:49: Man muss einfach weniger Pakete von außen holen

00:59:51: und man macht es den Leuten einfacher, die Laravel verwenden,

00:59:53: weil es direkt da mit drin ist.

00:59:54: Das fände ich schon cool, wenn das eine oder andere direkt übernommen wird

00:59:57: und offiziell gemacht wird.

00:59:59: Man muss jetzt fairerweise dazu sagen, dass sie zum einen sehr groß spenden,

01:00:03: also auch dann so Pakete, die viel genutzt werden,

01:00:05: da ist dann Laravel auch als offizieller Sponsor drin.

01:00:08: Und dass auch in der Dokumentation häufig Drittanbieter-Packages

01:00:12: einfach genannt werden, wenn die sich so als dominanter Platz hier

01:00:16: für einen bestimmten Aspekt herausgestellt haben.

01:00:18: Und ich weiß gar nicht, ob ich da so ein Fan davon wäre,

01:00:21: wenn die sich noch mehr Sachen einkaufen,

01:00:23: weil dann wird es ja immer mehr opinionated.

01:00:25: Und wenn ich dann, so wie wir, mit diesen Starter-Kits nicht anfangen kann,

01:00:28: dann werden wir es trotzdem so ein bisschen aufgedrückt.

01:00:31: Und gleichzeitig gibt es auch schon so viele offizielle Pakete,

01:00:35: die auch teilweise so ein bisschen widersprüchlich sind.

01:00:38: Und das ist so das andere Problem, was ich sehe.

01:00:40: Dadurch, dass das eben so ein altes Tool ist,

01:00:44: das über Jahre gewachsen ist und dementsprechend auch

01:00:47: einen gewissen Abwärtskompatibilitätsanspruch mit sich bringt,

01:00:51: gibt es da schon häufig mehrere Wege, die nach Rom führen,

01:00:56: die so ein bisschen mit den Kompetenzen, die PHP ja immer mehr dazugewonnen hat,

01:01:01: auch erst gekommen sind.

01:01:03: Also man kann Konsolenbefehle, also so Scheduled-Befehle,

01:01:08: die regelmäßig laufen, kann man im Kernel hinterlegen.

01:01:11: Man kann sie aber auch in der Console-PHP hinterlegen.

01:01:14: Man kann aber auch PHP-Attribute hinterlegen.

01:01:15: Man kann aber auch PHP-Attribute hinterlegen.

01:01:16: Man kann aber auch PHP-Attribute hinterlegen.

01:01:17: bulb De bodily

01:01:23: der

01:01:24: d

01:01:25: d

01:01:25: e

01:01:28: d

01:01:30: d

01:01:32: d

01:01:35: d

01:01:41: d

01:01:43: d

01:01:44: d

01:01:45: d

01:01:45: dass sich das so, ja, dass das so viel Legacy-Code mitschleppt.

01:01:49: Und ich habe sogar das Gefühl, dass die ab und zu versuchen,

01:01:51: schon das auch sehr aufzuräumen.

01:01:53: Also gerade diese Geschichte mit Models, verzeih ich jetzt mal,

01:01:55: einmal kicken, das war jetzt nicht so wahnsinnig erfolgreich.

01:01:58: Ist dann ja in der Welt 8, glaube ich, wieder reingekommen.

01:02:00: Aber ich habe schon das Gefühl, dass der Versuch da ist,

01:02:03: das auch konsistent zu halten.

01:02:04: Und dass man jetzt nicht unbedingt an allen alten Sachen hängt.

01:02:07: Das ist ja einfach dem geschuldet, dass das PHP ist,

01:02:09: dass man die Befehle auch in verschiedene Dateien reinschreiben kann,

01:02:13: die einfach in der Anwendung aufgerufen werden.

01:02:14: Aber es gibt ja schon immer einen aktuellen Best-Practice-Weg.

01:02:17: Klar, wenn du jetzt eine Anwendung hast, die vor fünf Jahren geschrieben wurde,

01:02:20: natürlich werden da noch Sachen anders gemacht.

01:02:22: Aber dass wir es ja nie verhindern können.

01:02:24: Also ich glaube, wir haben auch gut dargelegt,

01:02:26: warum wir Laravel so gerne benutzen.

01:02:28: Und jetzt auch diese etwas bewölkten Aussichten

01:02:32: ändern daran meiner Meinung nach nichts.

01:02:34: Im Moment kann man Laravel uneingeschränkt empfehlen,

01:02:38: meiner Meinung nach.

01:02:39: Ja, es gibt vor allem auch nichts Besseres.

01:02:40: Es gibt vor allem auch nichts Besseres, genau.

01:02:43: Es gibt da so ein paar...

01:02:44: Es gibt da so ein paar potenzielle Sorgen,

01:02:46: die man mal im Kopf behalten sollte.

01:02:48: Aber im Moment spricht da meiner Meinung nach nichts dagegen,

01:02:51: dass wir das auch weiterhin mit großer Begeisterung einsetzen.

01:02:54: Auch weil wir jetzt schon so viel Kompetenz in-house dafür geschaffen haben,

01:02:58: wie wir bestimmte Dinge angehen.

01:03:00: Man muss ja wirklich sagen, wir setzen das in Riesenanwendungen ein,

01:03:03: die super performant laufen, die richtig cool laufen,

01:03:06: wo wir unterschiedliche Entwickler, auch neue Entwickler,

01:03:09: dran setzen können, die Laravel-Know-how haben.

01:03:12: Und die finden sich da schnell zurecht.

01:03:13: Und die Anwendungen funktionieren einfach richtig, richtig geil.

01:03:17: Und ich bin da super happy mit, wie das funktioniert.

01:03:19: Und wir sind ja auf ganz viele coole Features gar nicht eingegangen.

01:03:22: Und das ist auch, glaube ich, nicht der Sinn des Podcasts,

01:03:24: hier alles durchzugehen.

01:03:25: Aber so eine der Sachen, die ich liebe,

01:03:27: sind einfach so Factories und Migrations.

01:03:29: Also sich die Datenbank zusammenzubasteln mit den Migrations.

01:03:33: Sich dann mit Factories automatisiert schon Testdaten reinzuschieben,

01:03:37: die dann der nächste Entwickler auch einfach ausfüllen kann, nutzen kann und so.

01:03:40: Das sind alles Sachen, ich weiß gar nicht,

01:03:41: ob die jetzt Laravel-spezifisch sind.

01:03:43: Aber...

01:03:44: Das sind Sachen, die sind natürlich total klasse an so einem Framework,

01:03:46: die richtig gut funktionieren,

01:03:48: die eine Entwicklung einfach machen,

01:03:49: die eine Entwicklung im Team einfach machen.

01:03:51: Und ich glaube, insgesamt ist der Podcast hier zu negativ,

01:03:55: was Laravel angeht.

01:03:56: Laravel ist insgesamt wirklich ein sehr, sehr cooles Framework.

01:03:58: Jetzt haben wir die negativen Sachen so ein bisschen zum Schluss als Rauswerfer genommen.

01:04:03: Das war vielleicht jetzt auch nicht die beste Spannungskurve.

01:04:05: Aber ich hoffe, wer jetzt nochmal zurückspult auf Minute 10,

01:04:08: der kann nochmal hören, wie wir uns in Begeisterung suhlen.

01:04:12: Vielleicht als kleinen Rausschrei.

01:04:13: Vielleicht auch als kleinen Teaser.

01:04:15: Stichwort Augenoffenheit nach Alternativen.

01:04:17: Gibt es ja einen neuen, sehr kleinen und sehr schwachen,

01:04:21: aber dennoch leuchtenden Stern am Horizont.

01:04:24: Und zwar ist das Tempest-PAP,

01:04:26: was auch so ein bisschen aus dem Laravel-Ökosystem herausgeboren wurde.

01:04:31: Und wo der Maßstab ist, wir machen Laravel nochmal neu,

01:04:36: aber von Grund auf und mit den aller, allerneuesten PHP-Features

01:04:41: und den ganzen fancy Dingen, die es da inzwischen gibt.

01:04:43: Das ist noch...

01:04:43: Also auf gar keinen Fall eine Empfehlung, auch wenn es jetzt 1.0 ist

01:04:47: und noch bei weitem hinter dem Lieferumfang von Laravel,

01:04:51: aber nur mal noch ein anderes Stichwort reingehauen zu haben

01:04:55: für die Tabs-Liste, die jetzt offen ist mit ORMs und Queues und anderen Dingen.

01:05:00: Cool.

01:05:01: Ja, Kay, wir haben ja jetzt in letzter Zeit versucht,

01:05:04: tatsächlich unseren Podcast mal wieder wöchentlich zu veröffentlichen.

01:05:06: Da will ich jetzt auf keinen Fall versprechen, dass das weiter so geht,

01:05:09: weil das für uns natürlich schon auch viel Arbeit bedeutet.

01:05:12: Und gerade du jetzt mit deiner vier Tage

01:05:13: Woche noch weniger Zeit hast als vorher.

01:05:15: Aber im Moment gelingt es uns ganz gut.

01:05:18: Und da sei einfach nochmal darauf hingewiesen,

01:05:19: wir versuchen das regelmäßig zu machen.

01:05:21: Kann aber auch sein, dass wir wieder auf so einen zwei Wochen Rhythmus switchen.

01:05:24: Mal sehen, wie das in Zukunft läuft.

01:05:25: Eine Bitte muss ich noch anschließen.

01:05:27: Und zwar haben wir noch relativ wenig Bewertungen bei Apple Podcast,

01:05:31: bei Spotify und den anderen Plattformen, die es so gibt.

01:05:33: Obwohl wir relativ viele Hörer haben, können wir auch nochmal in der Folge

01:05:36: wieder darauf eingehen, wie es im Moment so läuft.

01:05:38: Und wenn jemand Lust hat, bewertet uns doch.

01:05:41: Hinterlasst uns einen Kommentar, freuen wir uns sehr darüber.

01:05:43: Und hilft uns, das Ganze einfach ein bisschen bekannter zu machen.

01:05:47: Gut, Felix, ich weiß nicht, wie es dir geht, aber mir ist warm

01:05:50: und wir haben es geschafft für heute, oder?

01:05:52: Der Kaffee ist leer. Wie steht es um deinen Tee?

01:05:55: Ja, mein Tee ist leer und mein Thermometer zeigt jetzt 29,1 Grad an.

01:05:58: Das heißt, ich habe hier wild gestikuliert

01:06:01: und die Temperatur scheinbar noch ein bisschen in die Höhe getrieben.

01:06:05: Dann bedanke ich mich für deine Zeit

01:06:07: und bedanke mich bei euch da draußen fürs fleißige Zuhören.

01:06:10: Ich hoffe, ihr konntet was mitnehmen.

01:06:12: Und dann sehen wir uns zur nächsten Folge.

01:06:13: Auf jeden Fall nächste Woche wieder.

01:06:16: Okay, das macht jetzt Druck.

01:06:18: Alles klar, Kay, ich danke dir und wir hören uns. Ciao, ciao.

Neuer Kommentar

Dein Name oder Pseudonym (wird öffentlich angezeigt)
Mindestens 10 Zeichen
Durch das Abschicken des Formulars stimmst du zu, dass der Wert unter "Name oder Pseudonym" gespeichert wird und öffentlich angezeigt werden kann. Wir speichern keine IP-Adressen oder andere personenbezogene Daten. Die Nutzung deines echten Namens ist freiwillig.