News

A New Local Error Page in Laravel 12.29

Published
A New Local Error Page in Laravel 12.29 image

Release updates

Never miss a Laravel release

Get an email whenever a new Laravel release lands.

The Laravel team released version 12.29.0 this week with a new local debug page, a cache session driver, model resource PHP attributes, and more.

New Local Debug Page

Ryuta Hamasaki and Jeremy Butler created a brand-new local exception page for Laravel applications. The new exception page retains the "Copy as Markdown" button released in Laravel 12.25, and removes manual dark/light/toggle in favor of automatically detecting light vs. dark mode.

Local error page released in Laravel 12.29
Error page released in Laravel (v12.29.0)
Local error page with Dark mode
Error page with Dark mode (v12.29.0)
Previous local error page as shown in Laravel 12.25
Previous error page as shown in Laravel 12.25

See Pull Request #57036 for details.

Cache Session Driver

João Pedro Lopes—along with various community developers and core Laravel team members—contributed a cache session driver. It's best to read through the discussion and code in Pull Request #56887, but here's an example from that discussion of sticky database connections across requests:

namespace App\Http\Middleware;
 
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Context;
use Illuminate\Support\Facades\Date;
use Illuminate\Support\Facades\DB;
use Symfony\Component\HttpFoundation\Response;
 
class StickyWriteConnections
{
public function handle(Request $request, Closure $next): Response
{
if (! $request->hasSession()) {
return $next($request);
}
 
$expiry = $request->session()->cache()->get('use_write_connection_until');
 
$expiry?->isFuture()
&& DB::connection('pgsql')->useWriteConnectionWhenReading()
&& Context::addHidden('use_write_connection_until', $expiry);
 
$response = $next($request);
 
(DB::getConnections()['pgsql'] ?? null)?->hasModifiedRecords()
&& $request->session()->cache()->remember('use_write_connection_until', 10);
 
return $response;
}
}

UseResource and UseResource Collection Attributes

Luca Patera contributed the ability to define resource classes directly on a model using PHP attributes. Using these attributes, you can avoid boilerplate when converting a model to the intended resource:

// Before
$model->toResource(MyCustomNameResource::class);
$collection->toResourceCollection(MyCustomNameCollectionResource::class);
 
// After
$model->toResource();
$collection->toResourceCollection();

Model attributes are defined on the model class, as follows:

use App\Http\Resources\MyCustomNameResource;
use App\Http\Resources\MyCustomNameCollectionResource;
 
#[UseResource(MyCustomNameResource::class)]
#[UseResourceCollection(MyCustomNameCollectionResource::class)]
class MyModel extends Model {}

See Pull Request #56966 for details.

JSON Format Added to the schedule:list Command

Danny Foster contributed a --json flag to the schedule:list Artisan command. Returning this data as JSON is useful for monitoring deployments and integrations. Here's an example from the pull request:

[
{
"expression": "0 0 15 * *",
"repeat_seconds": null,
"command": "php artisan backup:run",
"description": "Run daily backup process",
"next_due_date": "2025-09-15 00:00:00 +00:00",
"next_due_date_human": "5 days from now",
"timezone": "UTC",
"has_mutex": false
}
]

This enables neat commands piped to things like the jq for monitoring to ensure scheduled tasks exist during a deployment, for example:

php artisan schedule:list --json | jq '.[] | select(.command | contains("backup"))'

Release notes

You can see the complete list of new features and updates below and the diff between 12.28.0 and 12.29.0 on GitHub. The following release notes are directly from the changelog:

v12.29.0

Paul Redmond photo

Staff writer at Laravel News. Full stack web developer and author.

Sponsored

serpapi logo
SerpApi

The Web Search API for Your LLM and AI Applications

Visit SerpApi

The latest

View all →
WhenMounted and BigInt Props in Inertia.js v3.8 image

WhenMounted and BigInt Props in Inertia.js v3.8

Read article
Postcodes for Laravel: GB Postcode Lookup and Geography Data image

Postcodes for Laravel: GB Postcode Lookup and Geography Data

Read article
Laravel 14 Adds a defaults() Method to Eloquent Models image

Laravel 14 Adds a defaults() Method to Eloquent Models

Read article
Laravel AI SDK and Laravel MCP Security Fixes: Update Now image

Laravel AI SDK and Laravel MCP Security Fixes: Update Now

Read article
Mailbox for Laravel: Preview and Test Rendered Email image

Mailbox for Laravel: Preview and Test Rendered Email

Read article
Count Worker Crashes as Job Exceptions in Laravel 13.34 image

Count Worker Crashes as Job Exceptions in Laravel 13.34

Read article