Joel Clermont
banner
jclermont.com
Joel Clermont
@jclermont.com
📖 Author of Mastering Laravel Validation Rules
✍️ I post useful Laravel tips https://masteringlaravel.com
🎙️ Co-host of https://show.nocompromises.io podcast
🐘 Organizer of Milwaukee PHP
You've decided to pin your GitHub Actions to commit hashes. How do you convert a whole repo, and how do you keep it that way? Let's look at some tools that help. masteringlaravel.io/daily/2026-0...
Making pinned GitHub Actions an enforceable rule | Mastering Laravel
So nobody quietly adds a floating tag later
masteringlaravel.io
September 29, 2026 at 12:00 PM
Have you ever had someone review your pull request, make changes without telling you, and just merge it in? In this week's podcast, Aaron and I discuss whether the traditional code review workflow still makes sense when AI tooling lets us move faster than ever. masteringlaravel.io/daily/2026-0...
Is the traditional code review workflow holding you back? | Mastering Laravel
When a reviewer merges your PR without asking
masteringlaravel.io
September 28, 2026 at 12:00 PM
Moving to a new database server is a great time to clean up warnings hiding in your schema. Let's see how to find them and fix them before the import. masteringlaravel.io/daily/2026-0...
Cleaning up deprecated warnings during a database migration | Mastering Laravel
Don't ignore it
masteringlaravel.io
September 25, 2026 at 12:19 PM
Pinning your GitHub Actions to a commit hash is more secure, but who wants to update all those hashes by hand? Let's look at how to automate it. masteringlaravel.io/daily/2026-0...
Keeping pinned GitHub Actions up to date | Mastering Laravel
Let a bot do the boring part
masteringlaravel.io
September 24, 2026 at 12:37 PM
Importing a big database dump can leave you staring at a silent terminal, wondering if anything is happening. Let's look at a small tool that fixes that. masteringlaravel.io/daily/2026-0...
Monitoring progress of a big database import | Mastering Laravel
Without this, it feels like it takes forever
masteringlaravel.io
September 23, 2026 at 12:17 PM
Once you pin a GitHub Action to a specific commit, how do you find out if that version has a security problem? Let's look at a tool that can tell you. masteringlaravel.io/daily/2026-0...
Is there a composer audit for GitHub Actions? | Mastering Laravel
GitHub's built-in answer isn't quite enough
masteringlaravel.io
September 22, 2026 at 12:10 PM
Aaron and I disagreed about how to reference third-party actions in our GitHub workflows. One side has a real-world attack to point at. Let's look at both arguments. masteringlaravel.io/daily/2026-0...
Should you pin GitHub Actions to a commit hash? | Mastering Laravel
Aaron and I argued about it
masteringlaravel.io
September 21, 2026 at 12:28 PM
Not every factory field requires a named state. Here's the simple rule I use to decide which ones do, and why I still add a state for the default value. masteringlaravel.io/daily/2026-0...
A good rule for when to create a factory state | Mastering Laravel
Make your tests more readable
masteringlaravel.io
September 18, 2026 at 12:51 PM
Here's a fun little exercise to see if your code could be improved. Read it out loud. Let's look at an example that demonstrates it. masteringlaravel.io/daily/2026-0...
Write code the way you say it | Mastering Laravel
Listen to the code before you refactor it
masteringlaravel.io
September 17, 2026 at 12:03 PM
Importing old data into a stricter MySQL server can fail on things like zero dates. Here's how to relax sql_mode for just the import session, without changing the server's configuration. masteringlaravel.io/daily/2026-0...
Loading a SQL backup without altering your configuration | Mastering Laravel
Sometimes data is messy
masteringlaravel.io
September 16, 2026 at 1:26 PM
A queued job that manually builds an expensive service is painful to test. Let's see how to leverage Laravel's container to make this a lot nicer. masteringlaravel.io/daily/2026-0...
The right place to inject a service into a queued job | Mastering Laravel
And why it's the better choice
masteringlaravel.io
September 15, 2026 at 12:56 PM
Ever notice that some Docker containers stop instantly while others hang for ten seconds? I'll explain why and show how to fix it. masteringlaravel.io/daily/2026-0...
Why are some Docker containers slower to restart? | Mastering Laravel
And how do you fix it?
masteringlaravel.io
September 14, 2026 at 12:24 PM
Laravel doesn't require a primary key on a pivot table, and the relationship works fine without one. Here's why I add one anyway, and the replication problem it avoids. masteringlaravel.io/daily/2026-0...
Why I always add a primary key to many-to-many tables | Mastering Laravel
Even when Laravel doesn't require it
masteringlaravel.io
September 11, 2026 at 12:22 PM
After adding Compose watch to a project, every rebuild paused for ten seconds before the new container came up. If your restarts drag like that, here's a workaround that may help improve speed. masteringlaravel.io/daily/2026-0...
A quick fix for slow Docker container restarts | Mastering Laravel
Compose may be waiting on a signal your dev server never handles
masteringlaravel.io
September 10, 2026 at 12:10 PM
When another site loads your built JS assets, Laravel never sees the request, so its CORS config can't help. Here's how to add the headers in Nginx for just those files, without slowing down everything else. masteringlaravel.io/daily/2026-0...
How to set CORS headers for built assets | Mastering Laravel
And do it efficiently
masteringlaravel.io
September 9, 2026 at 12:27 PM
I joined a project where the Vue front end was built into the Docker image with no bind mount, so every change meant a manual rebuild. One addition to the compose file turned that back into a normal dev loop. masteringlaravel.io/daily/2026-0...
Stop rebuilding your Docker image after every front-end change | Mastering Laravel
A Compose feature for projects that skip the bind mount
masteringlaravel.io
September 8, 2026 at 12:14 PM
Ever handed off a feature request with barely any detail and expected the developer to just figure it out? In this week's podcast, Aaron and I make the case for writing requirements before development starts, and why letting AI write them for you is a trap. masteringlaravel.io/daily/2026-0...
Write better requirements or pay for it later | Mastering Laravel
Even imperfect requirements beat none at all
masteringlaravel.io
September 7, 2026 at 12:49 PM
If another site loads a script built by your Laravel app, switching to Vite can quietly break it. Here's the CORS gotcha we hit and how we fixed it. masteringlaravel.io/daily/2026-0...
Something to know if serving scripts for other sites | Mastering Laravel
Especially if you moved to Vite
masteringlaravel.io
September 4, 2026 at 12:27 PM
Laravel serializes a model's loaded relationships when you queue a job, but not when you queue a collection of models. Here's the right way to load relationships inside the job. masteringlaravel.io/daily/2026-0...
Loading relationships inside a queued job | Mastering Laravel
Do it the Laravel way
masteringlaravel.io
September 3, 2026 at 12:33 PM
Sometimes multiple controller actions need the same guard logic, but it doesn't belong in a policy or form request. Here's a clean way to share redirect logic without messy hacks. masteringlaravel.io/daily/2026-0...
Sharing redirect logic between controller actions | Mastering Laravel
Without resorting to messy hacks
masteringlaravel.io
September 2, 2026 at 12:14 PM
Pennant defaults to the database driver, but not every feature flag needs a table row and a query. Today's tip shows when the array driver is the lighter choice. masteringlaravel.io/daily/2026-0...
You don't always need to put Pennant in the database | Mastering Laravel
The array driver keeps simple toggles lightweight
masteringlaravel.io
September 1, 2026 at 12:26 PM
Pennant defaults to the database driver, but not every feature flag needs a table row and a query. Today's tip shows when the array driver is the lighter choice. masteringlaravel.io/daily/2026-0...
You don't always need to put Pennant in the database | Mastering Laravel
The array driver keeps simple toggles lightweight
masteringlaravel.io
September 1, 2026 at 12:26 PM
Converting an Eloquent casts property to the newer casts method looks like a pure style choice for which syntax you prefer, but here's a real-world example where the two behave differently. masteringlaravel.io/daily/2026-0...
When new syntax is not actually equivalent functionality | Mastering Laravel
New syntax, same behavior. Usually.
masteringlaravel.io
August 31, 2026 at 12:18 PM
Dropping an index in a down migration usually means guessing at its name. Today's tip shows a cleaner way that lets Laravel figure it out for you. masteringlaravel.io/daily/2026-0...
A better way to drop a unique index | Mastering Laravel
It involves less guesswork
masteringlaravel.io
August 28, 2026 at 12:26 PM
Laravel redirects back to the previous page when validation fails, but what happens when there is no sensible previous page? Today's tip covers a redirect loop that shows up with bookmarks and new tabs, and a simple way to stop it. masteringlaravel.io/daily/2026-0...
When a validation failure causes a redirect loop | Mastering Laravel
Bookmarks and new tabs break the usual redirect back
masteringlaravel.io
August 27, 2026 at 12:57 PM