Laravel 13.3, weekly updates and tip

Laravel 13.3

A whole bunch in this week's release of Laravel 13.3.0. Here are the highlights:

  • Display memory usage in verbose queue worker output in #59379
  • Add lost connection to WorkerStopReason in #59370
  • Improve enum support to QueueManager::connection() in #59389
  • Pass request to afterResponse callback in #59410
  • Add isNotEmpty() to Uri class in #59408
  • Add capitalize parameter to Stringable::initials() in #59407
  • Add file() to ValidatedInput in #59396
  • Add enum support to channel() and driver() for LogManager in #59391
  • Allow variadic args for model attributes in #59421
  • #[CollectedBy] should follow inheritance in #59419
  • Add withoutFragment() to Uri in #59413
  • Add assertHasNoAttachments() to Mailable in #59443
  • Add driver() to MailFake in #59448
  • Add BatchStarted event in #59458
  • Introduce #[UnitTest] in #59432
  • Preserve document fragment when decoding query string in #59481
  • Allow returning Stringable from Model::casts() in #59479

You may review the full branch diff on GitHub for a complete list of changes.

Weekly Journal

Last week I made a few more tweaks to the Laravel 13.x Shift. Unfortunately, one of them introduced a temporary bug. When my PR (#59421) was merged, I jumped ahead and allowed Shift to use the new syntax. However, while it was merged, it was not yet tagged. So it caused an issue for Shifters. I reverted my change, but will now revert my revert.

This week I continued upgrading more of my Laravel applications to Laravel 13 - using Shift of course. Although, as noted last week, the /upgrade skill (or just AI) is pretty great at cycling through Composer dependencies. So if Shift doesn't one-shot them, I let AI do the rest. I also let AI assimilate a package that didn't have compatibility with Laravel 13 (more below).

I'm off next week. This is our first year going on Spring Break. So I'll be on vacation with the family. Probably no weekly update.

Weekly Tip

Back to assimilating a package… Despite my best efforts, there's always an incompatible package come upgrade season. While cycling through my Composer dependencies Claude noted vimeo/laravel was not compatible. It went on to suggest replacing it since it was just a few API calls (pretty cheeky). But it wasn't the first time I assimilated a lightly used or simple package.

I've said this before, but anytime you add a package to your project you take on the maintenance responsibility. Some packages are obviously worth the tradeoff - Cashier, Filament, etc. But a lot of packages are simply wrappers around API calls. With most APIs being well documented, AI is excellent at writing this code.

Lately, I've been letting it do so for several "API packages". I'll let it do a first pass converting calls to the Http client. If there are a lot, I'll encapsulate them in a service class (e.g. Vimeo or GitHub). Then accessing that as a real-time facade. My application code basically looks the same, and as facades, it's incredibly easy to test at all levels.