Hast du dich nach über einem Jahrzehnt seit der Einführung des beliebten Laravel-Frameworks jemals gefragt: „Was kann Laravel PHP-Entwicklern noch bieten?“

Wenn man bedenkt, wie sehr es die PHP-Entwicklung sowohl für Anfänger als auch für professionelle Entwickler/innen vereinfacht hat, könnte man meinen, dass es die Entwickler/innen dazu verleitet hat zu glauben, dass PHP die einfachste Programmiersprache ist.

Hat es also noch mehr Überraschungen für Laravel-Entwickler auf Lager? Oder hat es alle Möglichkeiten ausgeschöpft, um PHP-Entwickler zu unterstützen?

Nun, zumindest wissen wir, dass Laravel 10 eine Menge zu bieten hat. Das werden wir in diesem Artikel entdecken, wenn wir dich auf eine Reise durch die neuen Funktionen, Fehlerbehebungen und nun veraltete Methoden und Pakete von Laravel 10 mitnehmen.

Laravel Release-Zeitplan

Früher hat das Laravel-Kernteam jährlich zwei Hauptversionen veröffentlicht (eine alle sechs Monate).

Der Veröffentlichungszyklus wurde jedoch geändert, als Taylor Otwell, der Schöpfer von Laravel, ankündigte, dass nur noch eine einzige Hauptversion pro Jahr veröffentlicht werden würde. Dies ermöglichte es dem Kernteam und der Community, mehr Zeit und Mühe auf eine bestimmte Version des Frameworks zu verwenden und neue leistungsstarke Funktionen einzuführen, ohne dass es zu grundlegenden Änderungen kommt.

Laravel 10 sollte am 7. Februar 2023 erscheinen, nach der Veröffentlichung von Laravel 9 am 8. Februar 2022. Das Team brauchte jedoch mehr Zeit, um sein Kunstwerk fertigzustellen, und Laravel 10 wurde schließlich am 14. Februar 2023 veröffentlicht.

Laravel 11 wird nun voraussichtlich im ersten Quartal des Monats Februar 2024 veröffentlicht.

Außerdem werden gemäß der Support-Richtlinie für alle Laravel-Versionen 18 Monate lang Fehlerbehebungen und zwei Jahre lang Sicherheitsupdates angeboten.

Im Folgenden sind die voraussichtlichen Zeitpläne für Fehlerbehebungen und Sicherheitsupdates aufgeführt:

  • Laravel 9 wird bis zum 8. August 2023 mit Bugfixes und bis zum 6. Februar 2024 mit Sicherheitsupdates versorgt.
  • Laravel 10 wird bis zum 6. August 2024 Fehlerbehebungen und bis zum 4. Februar 2025 Sicherheitskorrekturen erhalten.
  • Laravel 11 wird voraussichtlich bis zum 5. August 2025 Fehlerbehebungen und bis zum 3. Februar 2026 Sicherheitsbehebungen erhalten.

Solltest du auf Laravel 10 upgraden?

Es ist wichtig, daran zu denken, dass wir die Laravel-Version unserer Anwendung nicht immer auf die neueste Version aktualisieren müssen, sobald eine neue Version veröffentlicht wird.

Laravel ist ein Open-Source-Framework, was bedeutet, dass wir jedes Mal, wenn wir eine neue Laravel-Instanz auf unserem Rechner installieren, Eigentümer der Codebasis des Frameworks sind. Das bedeutet, dass die App auch dann noch funktioniert, wenn die Version des Frameworks, die unsere App verwendet, nicht mehr unterstützt wird; wir müssen sie nur noch selbst pflegen.

Daher wird allgemein empfohlen, der Stabilität der Anwendung Vorrang vor Framework-Upgrades zu geben.

Kurz gesagt, du solltest ein Upgrade auf Laravel 10 in Betracht ziehen, wenn:

  • Die Anwendung mit der aktuellen Version stabil ist und ohne Probleme funktioniert.
  • Die neue Version entweder eine Funktion hinzufügt, die deine Anwendung benötigt, oder ein Problem behebt, das in deiner Anwendung aufgetreten ist.
  • Die Anwendung wird gut getestet, bevor die Änderungen des Upgrades in die Produktion übernommen werden.

Laravel 10 Hot Updates

Das Laravel 10-Logo mit dem Wort "Laravel" in leuchtendem Orange und der "10" in Grau
Laravel 10

Kinsta ist ein großer Fan von Laravel. Deshalb haben wir die Highlights von Laravel 10 in einem einzigen Artikel zusammengefasst, der dir als Referenz und Leitfaden für die Nutzung aller neuen Funktionen dienen soll. Deshalb empfehlen wir dir, diese Seite als Lesezeichen zu speichern und sie von Zeit zu Zeit wieder aufzurufen.

Neue Funktionen und Updates in Laravel 10

Das Spannendste an jeder neuen Version sind zweifellos die neuen Funktionen. Werfen wir also gleich zu Beginn einen Blick auf die neuen Funktionen und Updates in Laravel 10.

1. PHP 8.1: Das Herzstück von Laravel 10

PHP 8.1 ist die minimal erforderliche PHP-Version in Laravel 10. Einige Funktionen von PHP 8.1, wie z. B. readonly properties und array_is_list, werden in Laravel 10 verwendet.

2. Unterstützung für PHP 8.2

PHP 8.2 wurde am 8. Dezember 2022 veröffentlicht, nur zwei Monate vor der Veröffentlichung von Laravel 10. Das sollte dich aber nicht davon abhalten, die Funktionen von PHP 8.2 zu nutzen, denn Laravel 10 ist ohne zusätzliche Maßnahmen für PHP 8.2 bereit.

Tatsächlich unterstützt das gesamte Laravel-Ökosystem, einschließlich Forge, Vapor und Envoyer, PHP 8.2, und du kannst PHP 8.2 sogar mit Laravel 9 verwenden. Wie cool ist das denn?!

3. Upgrade der offiziellen Laravel-Pakete

Nicht nur das Framework wird professionell gewartet und regelmäßig aktualisiert, sondern auch alle offiziellen Pakete und das Ökosystem.

Im Folgenden findest du eine Liste der neuesten offiziellen Laravel-Pakete, die für die Unterstützung von Laravel 10 aktualisiert wurden:

  1. Breeze
  2. Cashier Stripe
  3. Dusk
  4. Horizon
  5. Installateur
  6. Jetstream
  7. Passport
  8. Pint
  9. Segel
  10. Scout
  11. Valet

Ein weiterer Leckerbissen für Rails-, Vue-, React- und Svelte-Fans: Inertiajs 1.0.1 unterstützt auch Laravel 10.

4. Predis Versions-Upgrade

Predis ist ein robuster Redis-Client für PHP, der dir helfen kann, das Beste aus dem Caching herauszuholen und ein fantastisches Nutzererlebnis zu bieten. Laravel unterstützte früher die Versionen 1 und 2, aber ab Laravel 10 unterstützt das Framework Predis 1 nicht mehr.

Obwohl in der Laravel-Dokumentation Predis als das Paket für die Interaktion mit Redis genannt wird, kannst du auch die offizielle PHP-Erweiterung verwenden. Diese Erweiterung bietet eine API für die Kommunikation mit Redis-Servern.

5. Native Typendeklarationen

Früher hat Laravel DocBlocks in seinem Skeleton-Code verwendet, um zu verdeutlichen, was ein Teil des Codes tut und welche Parameter oder Antworten zu erwarten sind. Dank der nativen Typendeklarationen in Laravel 10 wird sich dies jedoch ändern.

Am besten lässt sich diese Änderung anhand eines einfachen Beispiels erklären. Anstatt einer Funktion, die wie folgt aussieht:

/**
* Determine whether the user can create models.
*
* @param {{ namespacedUserModel }} $user
* @return IlluminateAuthAccessResponse|bool
*/

public function create({{ user }} $user)
{
  //
}

…wird sie so aussehen:

/**
* Determine whether the user can create models.
*/

public function create({{ user }} $user): bool
{
  //
}

Diese Änderung dient ausschließlich dem Nutzen für die Entwickler, da IDEs die Form des erwarteten Parameters und der Antwort kennen werden. Sie sorgt für mehr Klarheit bei der Typisierung, was bei nativen PHP-Typen nicht möglich ist. Dadurch werden die Code-Editoren mit Autovervollständigungsfunktionen besser funktionieren.

6. Alle Validierungsregeln standardmäßig aufrufbar

Wenn du in Laravel 9 eine Validierungsregel aufrufbar machen wolltest, musstest du ein --invokable Flag nach dem Artisan-Befehl hinzufügen. Das ist jetzt nicht mehr nötig, weil alle Laravel 10 Regeln standardmäßig aufrufbar sind. Du kannst also den folgenden Befehl ausführen, um eine neue aufrufbare Regel in Laravel 10 zu erstellen:

php artisan make:rule CustomRule

7. Unterstützung der nativen Spaltenmodifikation

Um die Notwendigkeit des DBAL-Pakets (doctrine/dbal) bei der Verwendung von change() zum Ändern von Spalten zu beseitigen, wurde in Laravel 10 eine neue Funktion eingeführt, die es Entwicklern ermöglicht, die Methode change() zu verwenden und Spalten mit MySQL, PostgreSQL und SQL Server zu ändern, ohne zusätzliche Pakete zu benötigen. Dies ist eine bedeutende und riskante Änderung, aber wir glauben, dass sie sich lohnt, da sie die Abhängigkeit von einem zusätzlichen Paket beseitigt.

Um die neue Funktion besser zu verstehen, schau dir das folgende Beispiel an:

$table->integer('user_balance')->unsigned()->default(0)->comment('balance'); // `user_balance` is an integer, unsigned, defaults to '0', and column comment is 'balance'

Wir nehmen an, dass wir eine Spalte für user_balance haben und ihren Typ ändern wollen. Ab Laravel 10 können wir das ganz einfach tun:

$table->bigInteger('user_balance')->change(); // This will change `user_balance` to bigInteger instead of just integer

Der obige Code wird den Typ der Spalte erfolgreich ändern, aber auch die Attribute UNSIGNED, DEFAULT und COMMENT löschen. Deshalb ist es wichtig, dass du daran denkst, alle Attribute hinzuzufügen, wenn du den Typ einer Spalte änderst:

$table->bigInteger('user_balance')->unsigned()->default(0)->comment('balance')->change();

Wenn du mehrere Datenbankverbindungen hast und DBAL bereits installiert hast, empfiehlt es sich, die Methode Schema::useNativeSchemaOperationsIfPossible() innerhalb der Boot-Methode in AppProvidersAppServiceProvider aufzurufen, um native Schema-Operationen nutzen zu können und um native Operationen zu verwenden, bevor du dich auf das Paket verlässt (SQLite zum Beispiel unterstützt dies noch nicht):

use IlluminateSupportFacadesSchema;
class AppServiceProvider extends ServiceProvider
{
  public function boot()
  {
    Schema::useNativeSchemaOperationsIfPossible();
  }
}

8. Column Type Native Retrieval

Eine weitere bemerkenswerte Funktion von Laravel 10 ist die Möglichkeit, die Methode Schema::getColumnType zu verwenden, ohne sich auf das Paket doctrine/dbal verlassen zu müssen. Derzeit verwenden wir Schema::getColumnType mit DBAL, um den Spaltentyp zu ermitteln. DBAL bildet jeden nativen Spaltentyp auf seinen DBAL-Typ ab und unterstützt viele der von Laravel in verschiedenen Datenbanken verwendeten Spaltentypen nicht.

In Laravel 10 hingegen gibt die neue Methode Schema::getColumnType den tatsächlichen Spaltentyp und nicht sein DBAL-Äquivalent zurück. Sie ermöglicht es dir auch, Integrationstests für die neue native Spaltenänderungsfunktion zu schreiben. Mit dieser Funktion kannst du entweder den Datentypnamen oder die gesamte Typdefinition der angegebenen Spalte abrufen:

Schema::getColumnType('products', 'price'); // decimal

9. Schnellerer Hash-Algorithmus

xxHash ist ein Hash-Algorithmus, der unglaublich schnell ist. Er zeichnet sich durch eine hohe Zufälligkeit und Streuung der Ausgabe sowie durch Einzigartigkeit aus, um Kollisionen zu vermeiden. Da PHP 8.1 xxh128 unterstützt und Laravel 10 auf PHP 8.1 läuft, ist es ideal, einen so zuverlässigen Hash-Algorithmus in Laravel 10 zu haben.

Taylor hat bei der Überprüfung dieser Änderung darauf hingewiesen, dass einige Pakete von Drittanbietern darauf angewiesen sind, dass die Dateinamen das exakte Format des SHA-1-Hashes haben, also des Algorithmus, den Laravel für das Hashing verwendet. Wenn du ein Upgrade auf Laravel 10 planst, solltest du daher alle Pakete von Drittanbietern, die du in deiner App verwendest, auf diese Tatsache überprüfen.

10. whereExists() Methodenunterstützung für Eloquent Builder

Wenn du whereExists() verwendest, musst du die verschachtelte Abfrage mit einer Closure konfigurieren. Glücklicherweise ist es mit Laravel 10 jetzt möglich, einen Eloquent Builder als verschachtelte Abfrage einzubinden. Das ermöglicht die Verwendung von benutzerdefinierten Builder-Methoden, Model-Scopes und so weiter.

Normalerweise machen wir das zum Beispiel, wenn wir whereExists() verwenden wollen:

Order::whereExists(function ($query) {
  $query->from('products')->whereColumn('products.order_id', 'orders.id');
});

Mit Laravel 10 können wir stattdessen einfach dies tun:

Order::whereExists(
  Product::whereColumn('products.order_id', 'orders.id')
);

11. Eager-Loading-Optimierung

Eine der interessanten neuen Funktionen von Laravel 10 ist die Optimierung des  Eager-Loading, wenn es keine Schlüssel zu laden gibt. Diese Änderung ist eher ein Fix als ein Feature, denn sie behebt ein aktuelles Problem, bei dem Eager-Loading-Relationen dazu führen, dass eine große Anzahl unmöglicher Abfragen ausgeführt wird.

Derzeit führt Laravel beim Eager-Loading von Relationen, die keine zu ladenden Schlüssel haben, immer noch eine ähnliche Abfrage aus wie diese:

select * from `table_name` where 0 = 1

Das neue Laravel 10-Update prüft jedoch, ob überhaupt Schlüssel vorhanden sind, und wenn nicht, wird eine leere Sammlung erstellt, sodass keine unnötigen Datenbankabfragen mehr nötig sind.

12. $path Optional für Dateisystem-Methoden

In Laravel 10 ist der Parameter $path für die folgenden Methoden optional:

  • FilesystemAdapter#putFile
  • FilesystemAdapter#putFileAs
  • UploadedFile#store
  • UploadedFile#storeAs
  • UploadedFile#storePublicly
  • UploadedFile#storePubliclyAs

Anstatt dies also zu tun, um eine hochgeladene Datei auf Amazon S3 zu speichern:

Storage::disk('s3')->putFile(‘post/images', $uploadedFile);

…können wir dies tun:

Storage::disk(Disk::PostImages)->putFile($uploadedFile)

13. Datenbankausdrücke und Grammatik-spezifische Formatierung

Nur vier Tage vor der Veröffentlichung von Laravel 10 hat das Laravel-Core-Team beschlossen, ein geniales Feature zu integrieren, das eine große Herausforderung bei der Arbeit mit mehreren Datenbanken angeht.

Wenn wir in früheren Versionen mit PostgreSQL und MySQL gearbeitet haben und den ersten Wert einer Liste als Alias zurückgeben wollten, mussten wir rohen Datenbankcode schreiben und Folgendes tun:

DB::table(‘visitors')
->when(isPostgreSQL(), fn ($query) => $query->select(DB::raw('coalesce(NULL, "user", "guest") AS "First Visitor"')))
->when(isMySQL(), fn ($query) => $query->select(DB::raw('coalesce(NULL, `user`, `guest`) AS `First Visitor`')))

Im obigen Code verwenden wir die FunktionCOALESCE(), um den ersten Wert, der nicht Null ist, als Alias mit dem Namen first visitor zurückzugeben. Jedes Mal, wenn wir eine Operation wie diese durchführen wollen, müssen wir also erneut Rohdatenbankcode schreiben.

Mit der neuen Funktion können wir wiederverwendbare Ausdrucksklassen erstellen, die die Rohausdrücke und Anweisungen, die wir für unsere Abfragen benötigen, nur einmal implementieren. So müssen wir keinen Rohdatenbankcode mehr schreiben, wenn wir weitere Datenbankfunktionen nutzen wollen.

Um auf das obige Beispiel zurückzukommen, folgen wir dem neuen Laravel 10-Ansatz, um das gleiche Ergebnis zu erzielen, ohne die Syntax des rohen Datenbankcodes zu verwenden.

Zunächst müssen wir zwei Klassen erstellen – eine für das Aliasing und eine für die Verwendung der Funktion COALESCE():

class Alias implements Expression
{
  public function __construct(
    public readonly Expression|string $expression,
    public readonly string $name,
  ) { }
  public function getValue(Grammar $grammar): string
  {
    return match ($grammar->isExpression($this->expression)) {
      true => "{$grammar->getValue($this->expression)} as {$grammar->wrap($this->name)}",
      false => $grammar->wrap("{$this->name} as {$this->name}"),
    };
  }
}
class Coalesce implements Expression
{
  public function __construct(
    public readonly array $expressions,
  ) { }
  public function getValue(Grammar $grammar): string
  {
    $expressions = array_map(function ($expression) use($grammar): string {
      return match ($grammar->isExpression($expression)) {
        true => $grammar->getValue($expression),
        false => $grammar->wrap($expression),
      };
    }, $this->expressions);
    $expressions = implode(', ', $expressions);
    return "coalesce({$expressions})";
  }
}

Dann können wir das gewünschte Ergebnis sowohl für MySQL als auch für PostgreSQL erreichen:

DB::table('visitors') ->select(new Alias(new Coalesce([NULL, 'user', 'guest']), 'First Visitor'));

Du denkst vielleicht, dass das zu viel Arbeit ist, aber es lohnt sich auf jeden Fall, weil du es nur einmal schreiben musst und es dir die Mühe erspart, die Syntax zu ändern, wenn du mit mehreren Datenbanken arbeitest.

Laut Tobias Petry, dem Ersteller des Pull Requests, wird diese Änderung außerdem zahlreiche Möglichkeiten für Pakete eröffnen, die die gängigsten Raw-Expression-Klassen für dich bereitstellen. Er hat sogar angekündigt, dass er sie nach der Veröffentlichung von Laravel 10 in einem eigenen Paket für die Community bereitstellen wird.

14. SQL Server-Update zur Verwendung von FETCH und OFFSET für Abfragen, die kein orderByverwenden

Wenn wir orderBy in einer Abfrage wie dieser verwenden:

$builder->select('*')->from('users')->skip(11)->take(10)->orderBy('email', 'desc');

Laravel erzeugt dann eine SQL-Anweisung, die FETCH und OFFSET verwendet:

select * from [users] order by [email] desc offset 11 rows fetch next 10 rows only

Wenn wir jedoch in früheren Versionen von Laravel orderBy aus der Abfrage streichen, fällt es auf die alte Methode zurück, die Ergebnisse zu verrechnen:

$builder->select('*')->from('users')->skip(11)->take(10);
select * from (select *, row_number() over (order by (select 0)) as row_num from [users]) as temp_table where row_num between 11 and 20 order by row_num

Mit dem neuen Update in Laravel 10 kann deine Laravel 10-Anwendung nun FETCH und OFFSET verwenden, auch wenn orderBy nicht vorhanden ist:

select * from [users] order by (SELECT 0) offset 10 rows fetch next 10 rows only

Dieses Update verbessert die Geschwindigkeit um 33% und erfordert weniger Ausführungsschritte.

15. PHPUnit 10 Unterstützung

Laravel 10 unterstützt PHPUnit 10. Es ist ein Framework für Unit-Tests für PHP und die Version 10 wurde am 3. Februar 2023 veröffentlicht. Laravel 10 wird weiterhin PHPUnit 9 und 8 unterstützen.

16. Sicherheitsverbesserungen für die Klasse Timebox

Laravel 10 enthält Sicherheitsverbesserungen für die Klasse Timebox, die die Anwendung vor zeitlosen Timing-Angriffen schützen soll. Die Klasse Timebox wird innerhalb der Methode hasValidCredentials implementiert.

Die Klasse Timebox unterstützt jetzt die Behandlung von Ausnahmen, die während der Ausführung eines Timebox-Callbacks ausgelöst werden.

17. dispatch() Das Verhalten der Methode ist in Laravel 10 identisch

Die Methode dispatch() innerhalb des DispatchesJobs Traits prüft jetzt auf eindeutige Jobs, genau wie die globale Hilfsfunktion dispatch(). Das bedeutet, dass die Methoden von dispatch() in Laravel 10 die gleichen Funktionalitäten haben.

18. Laravel Wimpel

Wenn du jemals an einer Webanwendung gearbeitet hast, die ständig mit neuen Funktionen aktualisiert wird, weißt du, wie wichtig Feature Flags sind. Die Erhaltung von Feature Flags ist jedoch mit viel Arbeit verbunden. Aber keine Sorge, Laravel bietet dir mit dem neuen Paket Laravel Pennant eine Lösung.

Laravel Pennant bietet eine einfach zu bedienende Lösung für die Pflege von Feature Flags. Es wird sogar mit einem In-Memory-Array-Treiber und einer Datenbank geliefert.

Du kannst ganz einfach ein neues Feature definieren:

use LaravelPennantFeature;
use IlluminateSupportLottery;
Feature::define('new-color-button', function () {
return Lottery::odds(1, 10);
});

Dann kannst du überprüfen, ob der Benutzer Zugriff auf diese Funktion hat oder nicht:

use LaravelPennantFeature;
if (Feature::active('new-color-button')) {
  // ...
}

In Laravel Blade sieht es sogar noch hübscher aus:

@feature('new-color-button')
// Kinsta Rules!!
@endfeature

19. Laravel-Prozess-Interaktion

Die neuen Prozessinteraktionen in Laravel 10 machen das Testen und Ausführen von CLI-Prozessen zu einem Kinderspiel. Sie bietet eine unkomplizierte API, die das Testen erleichtert. Nehmen wir das Beispiel aus dem ursprünglichen PR für dieses Feature von Taylor:

use IlluminateSupportFacadesProcess;
$result = Process::run('ls -la');
$result->successful();
$result->failed();
$result->exitCode();
$result->output();
$result->errorOutput();
$result->throw();
$result->throwIf(condition);

Dir ist wahrscheinlich aufgefallen, wie einfach und sauber der obige Code ist. Wenn es um die Erstellung von Prozessen geht, werden die Dinge nur noch besser:

$result = Process::timeout(60)->path(base_path())->env([...])->run('ls -la');
$result = Process::forever()->run('ls -la');

Um diese neue Funktion beim Testen zu nutzen, kannst du einen neuen, gefälschten Prozess wie diesen erstellen:

Process::fake([
  'ls *' => Process::result('Hello From Kinsta'),
]);

Dann kannst du den gefälschten Prozess ausführen und die neu verfügbaren Assertions verwenden:

$result = Process::run('ls -la');
Process::assertRan(function ($process, $result) {
  return $process->command == 'ls -la';
});
Process::assertRanTimes(function ($process, $result) {
  return $process->command == 'ls -la';
}, times: 1);
Process::assertNotRan(function ($process, $result) {
  return $process->command == 'cat foo';
});

20. Pest Scaffolding

Das Pest-Testgerüst ist jetzt standardmäßig aktiviert, wenn du neue Laravel-Projekte erstellst. Um diese Funktion zu aktivieren, verwende das --pest Flag, wenn du eine neue App mit dem Laravel Installer erstellst:

laravel new example-kinsta-app --pest

21. String Password Helper Function

Laravel 10 kann ein zufälliges und sicheres Passwort mit einer bestimmten Länge erstellen:

$password = Str::password(12);

Ausgeschiedene Methoden und Pakete in Laravel 10

Als Nächstes werfen wir einen Blick auf die Pakete und Methoden, die mit der Veröffentlichung von Laravel 10 abgeschafft wurden.

Laravel 10 verabschiedet sich von PHP 8.0

Das Laravel-Framework stellt in Laravel 10 die Unterstützung für PHP 8.0 ein. Wenn du deine Anwendung auf Laravel 10 aktualisieren möchtest, musst du daher zuerst die PHP-Version auf PHP 8.1 oder PHP 8.2 aktualisieren.

Entfernung veralteter Methoden

Die Laravel-Dokumentation wird mit allen Änderungen und wichtigen veralteten Methoden aktualisiert. Wenn du ein aktuelles Projekt auf Laravel 10 umstellen willst, sollte jeder Code, der eine veraltete Methode verwendet, in einem neuen Ansatz umgeschrieben werden, um das gleiche Ergebnis zu erzielen.

Hier ist eine Liste mit einigen der veralteten Methoden:

  • Die Methode Route::home (veraltet in Laravel 9)
  • Funktionen und Methoden rund um dispatchNow, nun veraltet, um Entwickler zu ermutigen, die Methode dispatchSync zu nutzen, die einzige unterstützte Methode für den sofortigen Dispatch
  • Die Methode getBaseQuery, die ein Äquivalent zu toBase hat
  • Die Klasse MaintenanceModeException
  • Die MocksApplicationServices Eigenschaft
  • Die Mail::failures Methode des Mail Fake
  • Die Eigenschaft $dates (verwende $casts stattdessen)
  • Die assertTimesSent() Methode
  • Unterstützung für Predis 1 und DBAL 2
  • Alle damit verbundenen Verwerfungen in doctrine/dbal seit Laravel die Unterstützung für Version 2 eingestellt hat

Wie man Laravel 10 installiert

Das Laravel-Kernteam hat dafür gesorgt, dass alle Entwicklerinnen und Entwickler in verschiedenen Umgebungen problemlos auf das Framework zugreifen können. Daher gibt es verschiedene Möglichkeiten, Laravel 10 auf deinem Rechner zu installieren. Es steht dir völlig frei, die für dich am besten geeignete zu wählen.

Laravel 10 auf MacOS installieren

Mit Docker und Laravel Sail kannst du ganz einfach mit Laravel 10 auf MacOS starten. Du kannst den folgenden Terminal-Befehl in dem Verzeichnis ausführen, in dem du die Anwendung installieren möchtest. Beachte dabei, dass nur alphanumerische Zeichen, Bindestriche und Unterstriche für den Namen der Anwendung erlaubt sind:

curl -s "https://laravel.build/example-kinsta-app" | bash

Nachdem der Installationsprozess abgeschlossen ist, gehst du in das Projektverzeichnis und verwendest Sail, um dein neues Projekt zu starten, indem du den folgenden Befehl im Terminal eingibst:

./vendor/bin/sail up

Sail verwendet seine integrierte Lösung für die Ausführung deines Laravel-Projekts mit Docker, und sobald es fertig ist, ist deine Anwendung auf http://localhost bereit.

Laravel 10 auf Windows 10 und 11 installieren

Docker Desktop kann verwendet werden, um Laravel 10 schnell unter Windows zu installieren. Unabhängig davon, ob du Windows 10 oder 11 verwendest, musst du zunächst eine der beiden folgenden Optionen auf deinem Rechner aktivieren:

  • Windows Subsystem für Linux 2 (WSL2) ist eine Funktion des Windows-Betriebssystems, mit der du ein Linux-Dateisystem und Linux-Befehlszeilentools direkt unter Windows ausführen kannst.
  • Hyper-V Backend-Funktion ermöglicht es dir, eine Softwareversion eines Computers, eine so genannte virtuelle Maschine, zu erstellen und zu betreiben.

Sobald du alle Docker-Anforderungen erfüllt hast, kannst du den folgenden Befehl in deinem Terminal ausführen:

curl -s https://laravel.build/example-kinsta-app | bash

Verwende dann Sail, um deine Anwendung auf http://localhost abzuspielen, indem du den folgenden Befehl im Stammverzeichnis deines neu installierten Laravel 10-Projekts eingibst:

./vendor/bin/sail up

Nebenbei bemerkt, bevorzugen viele Entwicklerinnen und Entwickler Linux gegenüber anderen Betriebssystemen, da sie damit effizienter und schneller arbeiten können. Mit WSL kannst du die Sicherheit, Leistung und Spielekompatibilität von Ubuntu genießen. Ubuntu ist eine Linux-Distribution oder Version von Linux, die für ihre Benutzerfreundlichkeit und einfache Bedienung bekannt ist.

Wir empfehlen dir, Visual Studio Code zu verwenden und die offizielle Microsoft WSL-Erweiterung zu installieren, damit du jeden Ordner im Windows Subsystem für Linux öffnen und die Vorteile des gesamten Funktionsumfangs von vscode nutzen kannst. Außerdem ist die Remote Development-Erweiterung eine weitere Option, auf die in der Laravel-Dokumentation hingewiesen wird.

Laravel 10 mit Composer installieren

Egal, ob du macOS oder Windows verwendest, mit Composer kannst du Laravel 10 im Handumdrehen zum Laufen bringen.

Zunächst musst du sicherstellen, dass du PHP ≤ 8.1, Node, npm und Composer auf deinem Rechner installiert hast.

Danach kannst du den Laravel Installer global installieren und ihn für die Installation deiner neuen Laravel 10 Anwendung verwenden:

composer global require laravel/installer
laravel new example-kinsta-app

Oder du kannst eine neue Laravel 10-Anwendung direkt nur mit Composer erstellen:

composer create-project laravel/laravel example-kinsta-app

So installierst du Laravel 11

Bis zur Veröffentlichung von Laravel 11 ist es noch ein Jahr hin. Aber Laravel 11 ist schon jetzt verfügbar, damit du seine Funktionen testen kannst. Es ist nicht nur verfügbar, sondern enthält auch einige zusammengeführte PRs auf GitHub, wie z.B. die Abschaffung der PHP 8.1 Unterstützung.

Die --dev Flagge im Laravel Installer installiert den Master-Zweig aus dem laravel/laravel Repository. Jetzt, wo Laravel 10 verfügbar ist, wird auch Laravel 11 auf dem Master-Zweig verfügbar sein. Wenn du den Laravel Installer verwendest, musst du nur diesen Befehl in deinem Terminal ausführen:

laravel new example-kinsta-app --dev

Oder, wenn du lieber den Composer verwendest:

composer create-project --prefer-dist laravel/laravel example-kinsta-app dev-master

Um den Composer-Befehl besser zu verstehen, findest du hier eine kurze Erklärung:

  • laravel/laravel: Das Paket für die Laravel-Installation
  • example-kinsta-app: Das neue Verzeichnis für dein neues Projekt (kann geändert werden)
  • dev-master: Die nächste Version von Laravel (in diesem Fall Laravel 11)

Nach der Installation von Laravel 11 kannst du die Version bestätigen, indem du in das neue Verzeichnis example-kinsta-app navigierst und diesen Artisan-Befehl ausführst:

$ php artisan --version
Laravel Framework 11.x-dev

So aktualisierst du ein Projekt auf Laravel 10

Spielst du mit dem Gedanken auf Laravel 10 zu aktualisieren? Das Laravel-Kernteam arbeitet hart an der Dokumentation, um eine nahtlose und unkomplizierte Upgrade-Anleitung zu erstellen, die alle möglichen Änderungen berücksichtigt. Sieh dir den offiziellen Laravel 10 Upgrade Guide an.

Du solltest auch Laravel Shift im Auge behalten, nachdem Laravel 10 veröffentlicht wurde. Laravel Shift bietet einen einfachen und automatisierten Ansatz für das Upgrade deiner Laravel-Version.

Wie man Laravel 10-Projekte einsetzt

Das Deployment von Laravel 10 unterscheidet sich nicht vom Deployment von Laravel 9 Projekten.

Hier sind die Serveranforderungen:

  • PHP ≤ 8.1
  • Ctype PHP-Erweiterung
  • cURL PHP-Erweiterung
  • DOM PHP-Erweiterung
  • Fileinfo PHP-Erweiterung
  • Mbstring PHP-Erweiterung
  • OpenSSL PHP-Erweiterung
  • PCRE PHP-Erweiterung
  • PDO PHP-Erweiterung
  • Tokenizer PHP-Erweiterung
  • XML PHP-Erweiterung
  • Filter PHP-Erweiterung
  • Hash PHP-Erweiterung
  • Session PHP-Erweiterung

Du kannst dein Laravel 10-Projekt in wenigen Minuten auf Kinsta bereitstellen und hosten, da Laravel eines der vielen unterstützten Frameworks für gehostete Anwendungen ist.

Bereitstellen von Laravel 10 auf Kinsta: Schritt-für-Schritt-Anleitung

Das Hosten und Bereitstellen deiner Anwendungen auf Kinsta hat mehrere Vorteile, u.a. musst du dich nicht um die Konfiguration der Bereitstellung kümmern.

Kinsta bietet ein benutzerfreundliches und leistungsstarkes Tool für die Bereitstellung von Anwendungen, die Verbindung zu Datenbanken und die Überwachung der Live-Performance. Dieses Tool heißt MyKinsta. In diesem Abschnitt führen wir dich durch die Schritte, mit denen du eine Laravel 10-Anwendung bereitstellen kannst.

1. Bereite deine Anwendung vor

Eine Beispielseite für eine Laravel 10-Anwendung, die oben "Laravel Kinsta" zeigt, gefolgt von einem Raster aus vier Inhaltsfeldern mit den Bezeichnungen "Kinsta", "Laracasts", "Laravel News" und "Vibrand Ecosystem"
Die Startseite einer Laravel 10-Anwendung, die auf Kinsta bereitgestellt wird

Angenommen, du hast eine Laravel 10-Anwendung vor Ort, dann müssen wir sicherstellen, dass ein GitHub-Repository für sie verfügbar ist. Wir werden dieses Repository später für die Bereitstellung der Anwendung nutzen.

Du kannst eine .htaccess-Datei in das Stammverzeichnis deiner Anwendung einfügen, die Folgendes enthält:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

Bei Laravel leitet dies alle Anfragen an public/index.php um. Bei Bedarf kannst du diesen Befehl jedoch beim Hinzufügen deiner Anwendung (Schritt „Prozesse einrichten„) oder nach der Bereitstellung auf der Seite „Prozesse“ der Anwendung aktualisieren. Du kannst folgendes verwenden:

  • heroku-php-apache2 /public
  • php artisan serve --host 0.0.0.0 --port 8080

2. Anmelden bei MyKinsta

Ein Login-Formular für MyKinsta, mit "MyKinsta Login" oben, gefolgt von den Feldern "E-Mail" und "Passwort", mit einer lila "Login"-Schaltfläche am unteren Rand
Die MyKinsta-Anmeldeseite

Gehe auf die Anmeldeseite von MyKinsta und gib deine E-Mail-Adresse und dein Passwort ein. Wenn du noch kein Konto hast, kannst du ein neues Konto einrichten und erhältst 20 US-Dollar Rabatt auf den ersten Monat deines Abonnements mit einem beliebigen Preisplan.

3. Autorisiere Kinsta auf GitHub

Sobald du dich eingeloggt hast, wirst du feststellen, dass du im Dashboard die Möglichkeit hast, eine WordPress-Site, eine Anwendung oder eine Datenbank zu erstellen. Wir klicken auf die Schaltfläche GitHub verbinden, um uns mit GitHub zu verbinden.

Ein Teil des MyKinsta-Dashboards, das drei rechteckige Kacheln zeigt: "WordPress-Site" mit der Aktionsschaltfläche "Site erstellen", "Anwendung" mit der Aktionsschaltfläche "GitHub verbinden" und "Datenbank" mit der Aktionsschaltfläche "Datenbank erstellen"
Das MyKinsta Dashboard

Als nächstes klickst du auf die Schaltfläche Mit GitHub fortfahren. Wenn du noch nicht bei GitHub eingeloggt bist, wird dir die Möglichkeit angezeigt, dich einzuloggen. Dann kannst du der Kinsta-GitHub-Anwendung den Zugriff auf dein GitHub-Konto erlauben, indem du Kinsta autorisieren wählst.

Zum Schluss leitet GitHub deinen Browser zu MyKinsta weiter, damit du mit der Einrichtung der Anwendung fortfahren kannst.

Ein modales Fenster mit der Meldung "GitHub Integration: Verbinde Kinsta hier mit deinem GitHub-Namensraum, um deine bestehenden Repositories zu importieren" mit einer weißen Schaltfläche "Abbrechen" und einer lila Schaltfläche "Mit GitHub fortfahren"
Verbinden von MyKinsta mit GitHub

Nachdem du mit GitHub verbunden bist, wird das Popup/Modal Anwendung hinzufügen angezeigt, das ein Dropdown-Menü zur Auswahl eines GitHub-Repositorys enthält. Klicke auf das Feld GitHub-Repository und wähle im Dropdown-Menü GitHub-Berechtigungen bearbeiten.

Das Formular "Antrag hinzufügen" in MyKinsta, das sich auf den Unterabschnitt "Antragsdetails" konzentriert, mit dem Text "Zweig auswählen", gefolgt von zwei Feldern: "GitHub-Repository" und "Standard-Zweig"
Hinzufügen einer Anwendung zu MyKinsta

Dadurch öffnet sich in deinem Browser ein neuer Tab mit der GitHub-Webseite, auf der du auswählen kannst, auf welche Daten Kinsta zugreifen darf. Anstatt den Zugriff auf alle Repositories freizugeben, solltest du nur die Repositories auswählen, die Kinsta nutzen soll.

Klicke auf Nur Repositories auswählen und wähle das Repository aus, das du bereitstellen möchtest.

Es erscheint die Aufforderung "Kinsta installieren" mit den Optionen "Alle Repositories" oder "Nur ausgewählte Repositories", gefolgt von einer grünen Schaltfläche "Installieren"
Kinsta den Zugriff auf GitHub gewähren

Klicke dann auf Installieren, und schon bist du fertig!

Wenn du zu MyKinsta zurückkehrst und auf das Feld GitHub-Repository klickst, sollte das autorisierte Repository sichtbar sein. Außerdem kannst du das Kontrollkästchen Automatische Bereitstellung bei Übergabe aktivieren, damit MyKinsta deine Anwendung automatisch bereitstellt, sobald du Änderungen am GitHub-Repository vornimmst.

Der Anwendungsbereich "Zweig auswählen" in MyKinsta mit den beiden Feldern "GitHub-Repository" und "Standardzweig" sowie einem angekreuzten Kontrollkästchen "Automatische Bereitstellung bei Übergabe"
Auswählen eines Repository-Zweiges für MyKinsta

4. Grundlegende Details zur Anwendung hinzufügen

Jetzt kannst du der Anwendung einen Namen geben, der nur im Dashboard verwendet wird, und aus 25 Rechenzentren auswählen, so dass du deine Anwendung an dem geografischen Ort platzieren kannst, der deinen Nutzern am nächsten liegt. Wenn du Hilfe bei der Auswahl des idealen Rechenzentrums für deine Anwendung brauchst, schau dir unseren Leitfaden zur Auswahl des richtigen Rechenzentrumsstandorts an.

Der Abschnitt "Grundlegende Details" des MyKinsta-Anwendungserstellungsprozesses mit den Feldern "Anwendungsname" und "Standort des Rechenzentrums"
Hinzufügen der grundlegenden Details einer Anwendung

5. Umgebungsvariablen hinzufügen

Im folgenden Abschnitt geht es um das Hinzufügen von Umgebungsvariablen. Die wichtigste Variable ist APP_KEY.

Wenn du noch keinen Schlüssel in deiner .env-Datei hast, kannst du ihn mit einem Online-Laravel-Schlüsselgenerator erzeugen. Dann fügst du APP_KEY in das Feld Key 1 und den generierten App-Schlüssel in das Feld Value 1 ein.

Zum Schluss wählst du Available during runtime und Available during build process.

Der Anwendungsbereich "Umgebungsvariablen" in MyKinsta mit den Feldern für "Schlüssel 1" und "Wert 1" sowie den Kontrollkästchen für "Zur Laufzeit verfügbar" und "Während des Build-Prozesses verfügbar"
Hinzufügen von Umgebungsvariablen in MyKinsta

5. Build-Umgebung konfigurieren

Der Clou an der Sache ist, dass du gar nichts konfigurieren musst! Du kannst fortfahren, indem du auf die Schaltfläche Weiter klickst, und voilà: Du hast die Konfiguration der Build-Umgebung abgeschlossen. Wenn du jedoch die Build-Ressourcen verbessern möchtest, um eine schnellere Erstellung zu gewährleisten, kannst du im Feld Build-Ressourcen deine bevorzugte Auswahl treffen.

Das Feld Build-Pfad ist optional. Du kannst es leer lassen und MyKinsta wird den Stammordner verwenden.

Der Anwendungsbereich "Build Environment" in MyKinsta, mit Feldern und Auswahlboxen für "Build resources", "Set up container image automatically" und "Use Dockerfile to set up container image"
Konfigurieren der Build-Umgebung für die Anwendung

6. Prozesse und Zahlungsmethode einrichten

Im Abschnitt Ressourcen füllst du jedes Feld mit den folgenden Informationen aus:

  • Prozessname: Der Name, der in der Liste der Prozesse in deiner Anwendung angezeigt wird.
  • Prozesstyp: Wähle ihn sorgfältig aus, denn er kann nicht mehr geändert werden, wenn er einmal festgelegt ist. Du kannst jedoch nach der Bereitstellung auf der Seite Prozesse deiner Anwendung weitere Prozesse hinzufügen und ändern, z. B. einen Hintergrundjob.
  • Startbefehl: Der „Start“-Befehl für deinen Prozess (nicht erforderlich).
  • Pod-Größe: Die Pod-Kapazität, die du voraussichtlich für deinen Prozess benötigst.
  • Anzahl der Instanzen: Die Anzahl der Instanzen für deinen Prozess (max. 50).

Du kannst auch einfach auf Weiter klicken, ohne das Feld Startbefehl auszufüllen, da Kinsta den erforderlichen Befehl beim ersten Einsatz automatisch erkennt.

Der Abschnitt "Anwendung hinzufügen: Richte deinen Prozess ein" in MyKinsta, mit Feldern für "Prozessname", "Prozesstyp", "Startbefehl", "Podgröße" und "Instanzanzahl"
Einrichten der Prozesse der Anwendung

Im letzten Schritt überprüfst du die monatlichen Nutzungskosten, die für deine App berechnet wurden, und bestätigst dann deine Zahlungsmethode. Wenn du fertig bist, klicke auf die Schaltfläche Zahlungsmethode bestätigen.

Der Bildschirm mit den Zahlungsdetails in MyKinsta zeigt "Monatliche Nutzungskosten" und "Zahlungsmethode", wobei letztere eine Visa-Karte aufführt
Bestätige die Zahlungsdetails

Und schon bist du fertig! Kinsta erledigt die ganze Arbeit im Hintergrund, um deine Anwendung zu bedienen.

Die Registerkarte "Anwendungen" in Mykinsta zeigt eine bereitgestellte Anwendung mit dem Namen "example-kinsta-app" zusammen mit ihrer Quelle, ihrem Typ und dem Datum der letzten Änderung
Lade den Bereitstellungsprozess der Anwendung

Dann hast du Zugriff auf alle Details des Bereitstellungsprozesses sowie auf die temporäre Live-App-URL, die du später durch deine eigene Domain ersetzen kannst.

Der Abschnitt "Bereitstellungsdetails" in MyKinsta nach erfolgreicher Bereitstellung der Anwendung, der die Installationsinformationen der Anwendung zusammen mit den Build- und Bereitstellungsverifizierungshinweisen anzeigt
Erfolgreiche Bereitstellung der Laravel 10-Anwendung auf MyKinsta

Deine Laravel 10-Anwendung ist jetzt live auf Kinsta, aber was ist, wenn du eine Änderung in der Produktion vornehmen musst? Was ist, wenn wir das href Attribut eines Anker-Tags ändern wollen?

Da wir die Option Automatisches Deployment bei Commit aktiviert haben, erkennt MyKinsta alle Änderungen, die wir am deployten Zweig vornehmen, und aktualisiert die Live-Anwendung automatisch entsprechend.

7. Laravel 10 mit der MySQL-Datenbank verbinden

Jetzt, wo wir unsere Laravel 10-Anwendung bereitgestellt haben, können wir mühelos eine Datenbank erstellen und sie mit unserer Anwendung verknüpfen. Dazu musst du nur im linken Navigationsmenü auf Anwendungen klicken, dann auf Dienst hinzufügen und Datenbank auswählen.

Die Option "Datenbank erstellen" in MyKinsta, mit Feldern für die Angabe der grundlegenden Informationen der Datenbank, gefolgt von einer lila Schaltfläche "Datenbank erstellen"
Hinzufügen einer neuen Datenbank in MyKinsta

Nachdem du alle Felder ausgefüllt hast, klicke auf Datenbank erstellen. Damit wird eine neue Datenbank erstellt, die für interne und externe Verbindungen bereit ist. In unserem Szenario benötigen wir eine interne Verbindung zu dem Laravel 10-Projekt, das wir bereitgestellt haben.

Um das zu erreichen, musst du nur auf Anwendung hinzufügen im Abschnitt Interne Verbindungen klicken und deine Anwendung auswählen. Du kannst das Kontrollkästchen Umgebungsvariablen zur Anwendung hinzufügen aktivieren und MyKinsta wird alle .env Variablen ausfüllen, die deine Anwendung benötigt.

Die Option "Interne Verbindung hinzufügen" in MyKinsta für die Verbindung einer Datenbank mit einer Anwendung, mit Schlüsselwertfeldern, gefolgt von einer Schaltfläche "Verbindung hinzufügen"
Verbinden einer Datenbank mit einer Laravel 10 Anwendung

Damit ist deine Laravel 10-Anwendung implementiert und mit einer Datenbank verbunden.

Wie du zu Laravel 10 beiträgst

Obwohl Laravel von einem Kernteam gepflegt wird, wird es von über 3.000 freiwilligen Mitarbeitern aktiv weiterentwickelt.

Willst du einer dieser Mitwirkenden sein und die Zukunft von Laravel mitgestalten? Wenn du mit Ja antwortest, kannst du Entwicklern auf der ganzen Welt helfen, indem du eine neue Funktion hinzufügst, einen Fehler behebst oder sogar einen verwirrenden Teil der Dokumentation umschreibst.

Um zu Laravel 10 beizutragen, musst du Folgendes tun:

  1. Besuche das GitHub-Repository von Laravel und sieh dir die Pull Requests an, die mit [10.x] im Titel gekennzeichnet sind. So bekommst du einen klaren Überblick über alle Pull Requests für Laravel 10. Wenn einer der PRs den Beitrag anspricht, den du leisten wolltest, schau, ob du ihn verbessern kannst.
  2. Wenn dein geplanter Beitrag noch nicht von jemand anderem angesprochen wurde, kannst du selbst einen PR erstellen.
  3. Nicht alles ist es wert, der Codebasis des Frameworks hinzugefügt zu werden. Bemühe dich daher, nur Verbesserungen zu implementieren, die in Zukunft leicht zu pflegen sind und der großen Mehrheit der Laravel-Community helfen.
  4. Achte darauf, dass du dich an die Beitragsrichtlinien von Laravel hältst, damit du bessere Chancen hast, dass deine Änderungen in das Framework aufgenommen werden.

Ein weiterer Grund, Laravel 10 zu lieben, ist, dass du mit Bug Hunts Geld für deine Beiträge gewinnen kannst! Wir sehen uns das als Nächstes an.

Laravel 10 Fehlerjagd-Wettbewerb

Das Laravel 10-Logo, gefolgt von einem grünen Cartoon-Insekt mit grauen Streifen
Laravel 10 Fehlerjagd-Wettbewerb

Laravel 10 hat einen tollen Wettbewerb ausgeschrieben, bei dem ein zufällig ausgewählter Teilnehmer die Chance hat, 1.000 Dollar zu gewinnen. Dies war der erste Wettbewerb dieser Art in der Geschichte von Laravel. Er soll die Community dazu ermutigen, versteckte Bugs in Laravel 10 zu finden und zu patchen.

Die Regeln waren ganz einfach:

  • Nur PRs, die im 10.x-Zweig des laravel/framework Repository eingereicht wurden, konnten teilnehmen.
  • Es wurden nur „echte“ Fehlerbehebungen berücksichtigt. Neue Funktionen, Refactoring und Tippfehlerbehebungen wurden nicht berücksichtigt.
  • Jede Fehlerbehebung muss durch einen Test unterstützt werden.
  • Die angenommenen Fehlerbehebungen wurden auf GitHub gekennzeichnet und ein zufälliger Gewinner wird nach Abschluss des Wettbewerbs bekannt gegeben.

Der Wettbewerb war beendet, als die erste stabile Version von Laravel 10 am 14. Februar 2023 veröffentlicht wurde.

Zusammenfassung

Bis jetzt scheint Laravel 10 sehr vielversprechend zu sein und wir sind gespannt, was es der PHP-Welt alles bringen wird.

Wenn du nach weiteren Möglichkeiten suchst, die Leistung deiner Laravel-Anwendung zu verbessern, solltest du einen Wechsel zu einem Premium-Hosting-Anbieter in Betracht ziehen. Die Application Hosting-Lösungen von Kinsta gehören zu den schnellsten, sichersten und benutzerfreundlichsten der Branche. Sie wurden speziell für Entwickler entwickelt und bieten Produktionsoptimierung und 24/7-Experten-Support durch unsere eigenen erfahrenen Entwickler.

Mostafa Said

I’m Mostafa, a full-stack developer with a knack for all things Laravel, Inertia, and JavaScript frameworks. When I'm not coding, you can find me sharing my knowledge through tutorials, diving into hackathons (and winning a few), and spreading the love for tech by teaching what I've learned.