Laravel 9.17, weekly updates, and 🔥 tip

Laravel 9.17

Had a minor release late last week and a minor release today, bringing us to Laravel 9.17. Here are some highlights from both:

  • Add withWhereHas() to Eloquent in #42597
  • Support user authentication for Pusher in #42531
  • Add withoutEagerLoad() to Eloquent in #42641
  • Allow asserting data for pushed jobs in #42676
  • Allow controlling random string generation in tests in #42669
  • Add not_starts_with validation rule in #42683
  • Add quarterlyOn() schedule frequency in #42692

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

This version bump and update is automated for subscribers to a Shifty Plan. If you don't have one of those, be sure to bump your constraint and run composer update to get the latest features.

Weekly Journal

Last week I continued to work towards the v1.0 release of the Workbench desktop app. I focused mostly on updating the dependencies. This included the Docker image, Electron, Tailwind, and Vue. As always npm is a pleasure to work. I shared some of the fun in this tweet.

I also got back into live streaming Thursday by upgrading from Laravel 5.4 to Laravel 9.x. This was an unknown codebase for a volunteer organization a fellow developer submitted. Unfortunately the live stream was cut a bit short when I got a call from Izzy's daycare. But I recorded a Part 2 to finish demoing my upgrade process.

We took a weekend getaway for Ashley's birthday. I worked a little on the plane to finalize a team view for Shifts run under a Shifty Plan. Other than that, I tried to keep my laptop closed.

This week I'll focus to finish the team view, as well as tweak some of the bugs I found during the Human Shift.

I'll also live stream tomorrow writing code (and tests) for sending an email reminder for expiring Workbench licenses.

🔥 Tip

Last week I mentioned using atomic locks to help with a race condition when refreshing GitLab tokens.

This was my first time using atomic locks. The examples within the docs didn't have any code within the closures. So I wasn't quite sure how to return something.

As with most things in Laravel, the answer was what you'd expect - I just return it from the closure.

$bar = Cache::lock('foo')->get(function () {
return 'bar';