This release introduces a #[UnitTest] PHP attribute for skipping framework boot on individual test methods, variadic support for model attributes like #[Fillable] and #[Hidden], a new BatchStarted event in the job batching lifecycle, and more.
- New
#[UnitTest]attribute to skip framework boot per test method - Variadic args for
#[Fillable],#[Appends],#[Hidden], and other model attributes - New
BatchStartedevent for job batch lifecycle monitoring - Memory usage shown in verbose queue worker output
- Security:
install:broadcastingnow passes--ignore-scriptsto npm/pnpm
What's New
#[UnitTest] Attribute
A new #[UnitTest] attribute lets you skip framework booting for individual test methods within a TestCase that extends Laravel's base test case. This is useful when most tests in a class need the container but a few are pure unit tests that don't.
Without it, every test in the class pays the cost of booting the full framework. With #[UnitTest], those specific methods run as bare PHPUnit tests — which can be an order of magnitude faster.
use Illuminate\Foundation\Testing\Attributes\UnitTest; class LocationServiceTest extends TestCase{ public function test_getCoordinates_resolves_address_for_us(): void { // needs the container } #[UnitTest] public function test_getState_returns_state_from_abbreviation(): void { // no framework boot needed }}
Pull Request: #59432
Variadic Model Attributes
Several Eloquent model attributes now accept variadic arguments. Previously, you had to pass an array; now you can pass each value as a separate argument:
// Before#[Fillable(['first_name', 'last_name'])]#[Hidden(['password', 'secret'])]class User extends Model {} // After#[Fillable('first_name', 'last_name')]#[Hidden('password', 'secret')]class User extends Model {}
Passing a single array is still supported, so there are no breaking changes.
Pull Request: #59421
BatchStarted Event
A new BatchStarted event fires when the first job in a batch is processed (whether it succeeds or fails). This fills in a gap in the batch lifecycle:
BatchDispatched— jobs are queued, no worker has touched them yetBatchStarted— first job has been processedBatchFinished— all jobs are done (or cancelled)BatchCanceled— batch was cancelled
This makes it possible to distinguish between a batch that's been queued and one that's actively being worked, which is useful for progress monitoring and UI updates.
Pull Request: #59458
Memory Usage in Verbose Queue Worker Output
When running the queue worker with -v, each processed job now includes current memory usage alongside the existing timing information:
# Before2026-04-01 09:45:39 App\Jobs\ProcessReport 121599597 database reports 110.57ms DONE # After2026-04-01 09:45:39 App\Jobs\ProcessReport 121599597 database reports 44.58ms 132.5MB DONE
The memory reading uses the same logic as the worker's internal memoryExceeded check, so it gives you a direct view of how close a job is pushing toward the --memory limit.
Pull Request: #59379
Other Fixes and Improvements
Queue & Workers:
- Forward
releaseOnTerminationSignalsthrough schedule groups (#59357) - Added
LostConnectiontoWorkerStopReason(#59370) - Fixed dependency injection of faked queueing dispatcher (#59378)
- Cached
getLockForPopping()result inDatabaseQueue(#59435) - Enum support added to
QueueManagerconnection methods (#59389) - Enum support added to
LogManagerchannel and driver methods (#59391)
Scheduling:
- Fixed sub-minute scheduling skips at minute boundaries (#59331)
Models & Database:
- Fixed
incrementEach/decrementEachto scope to the model instance (#59376) - Fixed
MorphToeager load matching whenownerKeyis null and the result key is a non-primitive (#59394) CollectedByattribute now follows inheritance (#59419)Stringableobjects can now be returned fromcasts()(#59479)- Fixed macros with static closures (#59414)
HTTP & Requests:
- Added
->file()method to$request->safe()for accessing validated file inputs (#59396) - Pass request to
afterResponsecallback (#59410)
URI:
- Added
isNotEmpty()method to theUriclass (#59408) - Added
withoutFragment()method to theUriclass (#59413) - Fixed URI fragment preservation when decoding query strings (#59481)
Testing:
Collections:
Collectionmethods are now compatible with extended subclass constructors (#59455)
Schema:
MariaDbSchemaStatenow usesmysql --versionfor client detection instead ofmariadb --version(#59360)
Security:
- The
install:broadcastingcommand now passes--ignore-scriptsto npm/pnpm when installing packages, preventing lifecycle scripts from running during installation (#59485)
Upgrade Notes
No breaking changes are expected for typical applications. Review the full changelog for complete details when upgrading.
References