#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