Zum Inhalt springen

Laravel Release Notes

519 Einträge aus 4 Quellen. Zuletzt aktualisiert:

Folge Laravel, um die Release Notes in deinen Feed zu holen.

Angaben zum Datum

Datum aus der Quelle.

Erstmals gesehen am .

Laravel

Inertia: router.once für einmalige Event-Listener

Mit router.once() lassen sich Event-Listener registrieren, die sich nach einmaligem Auslösen automatisch entfernen, ohne manuelles remove().

Pull request by @sebastiandedeyne

Registering a one-time event listener previously meant calling remove() manually inside your own callback. router.once() handles the cleanup for you.

// Before
const remove = router.on("before", () => {
    remove();
    // ...
});

// After
router.once("before", () => {
    // ...
});

Originalquelle(öffnet in neuem Tab)Problem melden

Angaben zum Datum

Datum aus der Quelle.

Erstmals gesehen am .

Laravel

Inertia: rescue-Slot für fehlgeschlagene Deferred Props

Der neue rescue-Slot wird angezeigt, wenn eine Deferred Prop mit rescue: true serverseitig fehlschlägt, und bietet einen reloading-Wert für eine Wiederholen-Oberfläche.

Pull request by @pascalbaljet

When a deferred prop throws on the server using rescue: true, the frontend previously had no way to surface the failure - users would sit on the loading fallback indefinitely. The new rescue slot renders when a prop has been rescued, with a reloading boolean so you can build a proper retry UI.

return Inertia::render('Dashboard', [
    'stats' => Inertia::defer(fn () => Github::stats(), rescue: true),
]);
<Deferred data="stats">
  <template #fallback>
    <div>Loading...</div>
  </template>

  <template #rescue="{ reloading }">
    <button :disabled="reloading" @click="router.reload({ only: ['stats'] })">
      Retry
    </button>
  </template>

  <StatsOverview :stats="stats" />
</Deferred>

Originalquelle(öffnet in neuem Tab)Problem melden

Angaben zum Datum

Datum aus der Quelle.

Erstmals gesehen am .

Laravel

Inertia: Fehlerdialog-iFrame mit Sandbox abgesichert

Der iframe im Inertia-Fehlerdialog erhält sandbox="allow-scripts", sodass enthaltene Skripte nicht auf window.parent zugreifen können, ohne dass API-Änderungen nötig sind.

Pull request by @pascalbaljet

When Inertia displays a non-Inertia response in its error dialog, the content is rendered inside an iframe. This change adds sandbox="allow-scripts" to that iframe, blocking scripts inside from reaching window.parent and interacting with your application. No API changes required.

Originalquelle(öffnet in neuem Tab)Problem melden

Angaben zum Datum

Datum aus der Quelle.

Erstmals gesehen am .

Laravel

Inertia: host-Option für den SSR-Server

Der SSR-Server akzeptiert jetzt eine host-Option zur Wahl der Netzwerkschnittstelle, wobei der Standard weiterhin 0.0.0.0 ist.

Pull request by @pascalbaljet

The SSR server now accepts a host option to control which network interface it binds to. The default remains 0.0.0.0 so nothing changes unless you need it.

Originalquelle(öffnet in neuem Tab)Problem melden

Angaben zum Datum

Datum aus der Quelle.

Erstmals gesehen am .

Laravel

Inertia: withApp-Callback erhält Props

Der withApp-Callback bekommt nun die initialen Seiten-props übergeben und ist damit gleichauf mit setup, etwa zum Setzen der Sprache im SSR-Modus.

Pull request by @CL0Pinette

The withApp callback now receives the initial page props, giving it parity with setup. Use cases like setting a user locale in SSR mode - where the locale comes from page props - are now straightforward without falling back to setup.

Originalquelle(öffnet in neuem Tab)Problem melden

Angaben zum Datum

Datum aus der Quelle.

Erstmals gesehen am .

Laravel

Neuer Skill starter-kit-upgrade für Laravel Starter Kits

Der neue Claude-Code-Skill starter-kit-upgrade führt durch die Prüfung von Änderungen in den Vue-, React- und Livewire-Starter-Kits, damit nur gewünschte Neuerungen übernommen werden.

Pull request by @pushpak1300

Pulling in upstream starter kit improvements without clobbering your own customizations has always been a manual, risky process. The new starter-kit-upgrade Claude Code skill gives you a guided, audit-friendly path to review what's changed in the laravel/vue-starter-kit, laravel/react-starter-kit, or laravel/livewire-starter-kit and apply only the specific features you want.

Originalquelle(öffnet in neuem Tab)Problem melden

Angaben zum Datum

Datum aus der Quelle.

Erstmals gesehen am .

Laravel

Konversationsliste über HasConversations-Trait abrufbar

Ein neuer HasConversations-Trait für das User-Model stellt eine Eloquent-Beziehung zu Konversationen bereit, wobei updated_at mit neuen Nachrichten fortgeschrieben wird.

Pull request by @barryvdh

Building a conversation history sidebar previously meant writing raw SQL against the agent_conversations table. A new HasConversations trait for your User model exposes a proper Eloquent relationship, with updated_at advancing as messages arrive so ordering by recency just works.

class User extends Authenticatable
{
    use HasConversations;
}

$conversations = $request->user()
    ->conversations()
    ->latest('updated_at')
    ->paginate(20);

Originalquelle(öffnet in neuem Tab)Problem melden

Angaben zum Datum

Datum aus der Quelle.

Erstmals gesehen am .

Laravel

BroadcastAgent sendet stream_failed-Event bei Fehlern

Schlägt ein BroadcastAgent-Job mit einer unbehandelten Exception fehl, wird nun über den failed()-Hook ein stream_failed-Event gesendet, damit Clients den Fehler anzeigen und einen neuen Versuch ermöglichen können.

Pull request by @sumaiazaman

When a BroadcastAgent job threw an unhandled exception, the frontend had no signal that the stream had failed - leaving the user staring at a spinner indefinitely. A stream_failed event is now broadcast via the job's failed() hook so clients can surface the error and let users retry.

Originalquelle(öffnet in neuem Tab)Problem melden

Angaben zum Datum

Datum aus der Quelle.

Erstmals gesehen am .

Laravel

Stringable-Makro toAudio für Text-to-Speech

Über das neue Makro toAudio lässt sich aus jeder Stringable-Instanz direkt Sprache erzeugen, optional mit Provider, Voice, Instructions, Model und Timeout.

Pull request by @nhedger

Text-to-speech is now a fluent one-liner from any Stringable instance:

$response = Str::of('Hello world')->toAudio(timeout: 45);

// With more control
$response = Str::of('Hello world')->toAudio(
    provider: Lab::ElevenLabs,
    voice: 'alloy',
    instructions: 'Speak slowly',
    model: 'custom-model',
    timeout: 45,
);

Originalquelle(öffnet in neuem Tab)Problem melden

Angaben zum Datum

Datum aus der Quelle.

Erstmals gesehen am .

Laravel

passwordrules-Attribut in Passwortfeldern der Starter Kits

Alle Felder für neue Passwörter in den Starter Kits (Registrierung, Zurücksetzen, Aktualisieren) enthalten nun ein passwordrules-Attribut, damit Passwortmanager gleich ein passendes Passwort erzeugen.

Pull request by @joetannenbaum

Every new-password input across the starter kits - register, reset password, and update password pages - now includes a passwordrules attribute derived from Password::defaults()->toPasswordRulesString(). Password managers can generate a compliant password on the first try rather than failing against validation after the fact.

Originalquelle(öffnet in neuem Tab)Problem melden

Angaben zum Datum

Datum aus der Quelle.

Erstmals gesehen am .

Laravel

Laravel MCP: ResourceLink-Inhaltstyp (Spec 2025-06-18)

Laravel MCP unterstützt jetzt den Inhaltstyp resource_link der MCP-Spezifikation, der statt eingebettetem Inhalt einen URI-Verweis liefert und auch aus einer deklarierten Resource-Klasse erzeugt werden kann.

Pull request by @rupeshstha

Laravel MCP now supports the resource_link content type from the MCP spec. Unlike embedded resources that inline content, a resource link returns a URI pointer that the client fetches or subscribes to independently - better suited for large payloads, generated artifacts, and live subscriptions.

Response::resourceLink(
    uri: 'file:///data/report.json',
    name: 'monthly-report',
    mimeType: 'application/json',
    title: 'Monthly Sales Report',
    size: 2048,
);

Resource links can also be built from a declared Resource class, inheriting its URI, name, description, and MIME type - with optional overrides:

Response::resourceLink(WeatherForecastResource::class, title: 'Custom Title');

Originalquelle(öffnet in neuem Tab)Problem melden

Angaben zum Datum

Datum aus der Quelle.

Erstmals gesehen am .

Laravel

Pao: Umgebungsvariable PAO_FORCE

Die neue Umgebungsvariable PAO_FORCE=1 aktiviert PAO unabhängig von der Agent-Erkennung, was etwa Tests in Docker-Containern vereinfacht.

Pull request by @antonkomarev

Running tests inside Docker means agent environment variables often don't propagate into the container. A new PAO_FORCE=1 env var force-enables PAO regardless of agent detection, so you can drop it into a docker compose run command without enumerating every possible agent marker in your compose config.

docker compose run --rm -e PAO_FORCE=1 app vendor/bin/pest

Originalquelle(öffnet in neuem Tab)Problem melden

Angaben zum Datum

Datum aus der Quelle.

Erstmals gesehen am .

Laravel

Passkeys: runWith() deaktiviert alle Agents

Der Testhelfer runWith() deaktiviert während der Testausführung nun alle Agents statt nur Claude Code.

Pull request by @cosmastech

The runWith() testing helper now correctly disables all agents during test execution, not just Claude Code. Previously, other agents could still interfere with test runs.

Originalquelle(öffnet in neuem Tab)Problem melden

Angaben zum Datum

Datum aus der Quelle.

Erstmals gesehen am .

Laravel

Reverb: $hidden, $visible und $appends in Model-Komponenten berücksichtigt

Ranger berücksichtigt bei den generierten Typen nun die Eloquent-Eigenschaften $hidden, $visible und $appends, sodass die Struktur der tatsächlich serialisierten Ausgabe entspricht.

Pull request by @joetannenbaum

Eloquent's $hidden, $visible, and $appends properties now influence the types Ranger generates. Previously, the generated TypeScript could include attributes that would never appear in a serialized response, or miss custom appended accessors entirely. The resolved shape now matches what Eloquent actually serializes.

Originalquelle(öffnet in neuem Tab)Problem melden

Angaben zum Datum

Datum aus der Quelle.

Erstmals gesehen am .

Laravel

Surveyor: Inertia-Spezial-Prop-Typen werden aufgelöst

Surveyor löst bei den Inertia-Wrappern defer, optional, lazy, always und merge nun den inneren Typ aus dem Callback auf und markiert defer, optional und lazy als optional.

Pull request by @joetannenbaum

Inertia's defer, optional, lazy, always, and merge prop wrappers were previously falling through to reflection, which returned the wrapper class itself rather than the actual type inside. Surveyor now resolves the inner type directly from each wrapper's callback. defer, optional, and lazy are marked as optional since those props may not be present in the initial response.

Originalquelle(öffnet in neuem Tab)Problem melden

Angaben zum Datum

Datum aus der Quelle.

Erstmals gesehen am .

Laravel

Surveyor: @var-Docblocks überschreiben abgeleiteten Typ bei Array-Einträgen

Ein @var-Docblock direkt vor einem Array-Eintrag überschreibt in Surveyor nun den abgeleiteten Typ, ohne dass umgebender Code geändert werden muss.

Pull request by @JasBogans

Static analysis can't always follow deep Collection pipelines or SQL aliases down to a precise shape. A @var docblock placed immediately before an array item now overrides the inferred type, giving you an exact local escape hatch without changing any surrounding code.

return Inertia::render('Authors/createOrEdit', [
    'author' => $author,
    /** @var list<array{value:int,label:string}> */
    'categories' => Category::query()->orderBy('name')->get()
        ->map(fn (Category $c) => ['value' => $c->id, 'label' => $c->name])
        ->values()->all(),
]);

Originalquelle(öffnet in neuem Tab)Problem melden

Angaben zum Datum

Datum aus der Quelle.

Erstmals gesehen am .

Laravel

Laravel 13.x: Debounceable Queued Jobs

Queued Jobs lassen sich mit dem Attribut #[DebounceFor] oder direkt beim Dispatch so debouncen, dass innerhalb eines Zeitfensters nur der letzte Dispatch ausgeführt wird, und für ersetzte Jobs wird ein JobDebounced-Event ausgelöst.

Pull request by @matthewnessworthy

Bursty workloads finally have a clean answer. Debounceable jobs keep only the last dispatch in a window, so a user editing the same document ten times in thirty seconds triggers a single rebuild instead of ten. Apply the #[DebounceFor] attribute to any queued job, or debounce at the call site without touching the class:

use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\Attributes\DebounceFor;

#[DebounceFor(30)]
class RebuildSearchIndex implements ShouldQueue
{
    public function __construct(public int $documentId) {}

    public function debounceId(): string
    {
        return (string) $this->documentId;
    }

    public function handle(): void
    {
        SearchIndex::rebuild($this->documentId);
    }
}

Where ShouldBeUnique keeps the first dispatch and rejects the rest, debouncing flips that around so the most recent dispatch always wins. A JobDebounced event fires for any superseded job if you want to track it. Read more in the queue documentation.

Originalquelle(öffnet in neuem Tab)Problem melden

Angaben zum Datum

Datum aus der Quelle.

Erstmals gesehen am .

Laravel

Laravel 13.x: Health-Route liefert JSON

Die eingebaute Health-Route /up gibt nun JSON zurück, wenn die Anfrage dies verlangt, während Statuscodes und die Blade-Seite für Browser unverändert bleiben.

Pull request by @WendellAdriel

API-only apps can stop scraping HTML from /up. The built-in health route now returns JSON when the request asks for it, which makes load balancers, uptime monitors, and orchestrators a lot happier:

{ "status": "Application is up" }

Status codes stay the same, and browser requests still get the existing Blade page. No config required.

Originalquelle(öffnet in neuem Tab)Problem melden

Angaben zum Datum

Datum aus der Quelle.

Erstmals gesehen am .

Laravel

Laravel 13.x: Neuer JsonFormatter für Exception-Kontext

Der neue Illuminate\Log\Formatters\JsonFormatter übernimmt context()-Daten benutzerdefinierter Exceptions, auch aus verketteten Vorgänger-Exceptions, in strukturierte Logs.

Pull request by @cosmastech

Exception context is one of those things you only realize you needed after staring at production logs for hours. The new Illuminate\Log\Formatters\JsonFormatter ensures context() data on your custom exceptions actually shows up in structured logs, including context from previous exceptions in a chain. Wire it up in config/logging.php:

'formatter' => Illuminate\Log\Formatters\JsonFormatter::class,

Now an exception like this carries its enriched context all the way through to the log entry:

class MyException extends \RuntimeException
{
    public function context(): array
    {
        return [
            'luke' => 'cosmastech',
            'taylor' => 'taylorotwell',
        ];
    }
}

Whether the exception is sent through report() or written via Log::error() with an exception key, the structured payload now includes everything you put on the exception itself.

Originalquelle(öffnet in neuem Tab)Problem melden

Angaben zum Datum

Datum aus der Quelle.

Erstmals gesehen am .

Laravel

Laravel 13.x: prefersJsonResponses() im Application Builder

Mit prefersJsonResponses() in bootstrap/app.php werden breite Accept-Header als JSON behandelt, explizite text/html-Anfragen bleiben unberührt und der ursprüngliche Wert steht in X-Original-Accept.

Pull request by @WendellAdriel

Building an API and tired of curl requests coming back as HTML? One line in bootstrap/app.php now treats broad Accept headers as JSON, so auth redirects, validation errors, and exception pages all serialize properly for clients that didn't ask for HTML:

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
    )
    ->prefersJsonResponses()
    ->create();

Clients that explicitly request text/html are left alone, and the original Accept value is preserved on X-Original-Accept if you need it for logging. Default behavior is unchanged unless you opt in.

Originalquelle(öffnet in neuem Tab)Problem melden