Wydanie: 12 Marca 2024
Laravel 11 nie jest rewolucją, lecz ewolucją skupioną na:
Podstawowym wymogiem do uruchomienia Laravel 11 jest:
Pozwala to na korzystanie z nowych funkcji języka, takich jak:
readonlyNajwiększą wizualną zmianą jest domyślna struktura aplikacji.
Co zniknęło z domyślnego projektu?
app/Http/Kernel.phpapp/Console/Kernel.phpapp/Providers/ (wraz z 9 Service Providerami)config/ (domyślnie pusty!)app/Exceptions/Handler.phpEfekt: Mniej "szumu" w projekcie, skupienie na kodzie biznesowym.
bootstrap/app.php (2/4)Prawie cała konfiguracja startowa aplikacji została przeniesiona do jednego pliku:
<?php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up', // Nowy, wbudowany endpoint!
)
->withMiddleware(function (Middleware $middleware) {
// Rejestracja globalnego middleware
$middleware->web(append: [
\App\Http\Middleware\HandleInertiaRequests::class,
]);
})
->withExceptions(function (Exceptions $exceptions) {
// Obsługa wyjątków
})->create();
Katalog config/ jest teraz opcjonalny.
vendor).
php artisan config:publish databaseconfig/database.php)
.env.
bootstrap/app.php.bootstrap/app.php za pomocą ->withMiddleware().
routes/console.php (nie trzeba ich już ładować w Kernelu).
Nowe projekty domyślnie używają SQLite.
php artisan migratedatabase/database.sqlite.
DB_CONNECTION w pliku .env.
/upLaravel 11 automatycznie definiuje prosty endpoint /up do monitorowania stanu aplikacji.
bootstrap/app.php.DiagnosingHealth.Poprzednie wersje Laravela pozwalały na limitowanie zapytań tylko na poziomie minutowym.
Laravel 11 wprowadza limitowanie per-sekunda:
// W routes/api.php lub web.php
Route::middleware('auth:sanctum')
->prefix('v1')
->group(function () {
// Limituj do 10 zapytań na sekundę
Route::get('/user', ...)
->middleware('throttle:10,second');
});
// Lub w RateLimiter::for() w AppServiceProvider
RateLimiter::for('api', function (Request $request) {
return Limit::perSecond(10)->by($request->user()?->id ?: $request->ip());
});
APP_KEYProblem: Zmiana APP_KEY w działającej aplikacji unieważniała wszystkie
zaszyfrowane dane (np. sesje, cookie, zaszyfrowane pola w bazie).
Rozwiązanie w L11:
.env można zdefiniować listę poprzednich
kluczy.APP_PREVIOUS_KEYS=key_1,key_2,key_3APP_KEY.
APP_PREVIOUS_KEYS.APP_KEY.
Chociaż właściwość $casts nadal działa, preferowanym sposobem definiowania "castów" w
modelu jest teraz metoda casts().
// Stare podejście (nadal działa)
class User extends Model
{
protected $casts = [
'options' => 'array',
'status' => StatusEnum::class,
'is_active' => 'boolean',
];
}
// Nowe, preferowane podejście w L11
class User extends Model
{
protected function casts(): array
{
return [
'options' => AsArrayObject::class,
'status' => AsEnum::class,
'is_active' => 'boolean',
];
}
}
Daje to większą elastyczność i pozwala na używanie klas `As...` (np. `AsArrayObject` zamiast zwykłego 'array').
Choć to osobny pakiet, Reverb jest "duchowym" elementem ery L11.
# Instalacja
php artisan install:reverb
# Uruchomienie
php artisan reverb:start
Kolejny pakiet definiujący L11 to Prompts – rewolucja w komendach konsolowych.
$this->ask(), $this->confirm().
use function Laravel\Prompts\text;
use function Laravel\Prompts\select;
use function Laravel\Prompts\password;
$name = text(label: 'Jaka jest nazwa projektu?', required: true);
$type = select(
label: 'Jaki to typ projektu?',
options: ['app', 'package']
);
$apiKey = password(label: 'Podaj API Key:', validate: true);
bootstrap/app.php
i kaskadowe pliki config./up ułatwiają start i monitoring.
APP_KEY,
limitowanie zapytań per-sekunda.Dowiedz się więcej: Oficjalna dokumentacja Laravel 11