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
Pinned
As much as I love building with Laravel, I also find a lot of satisfaction helping other Laravel devs level up their skills.

I’d love to figure out a path to spend more of each week doing that in 2025. I feel like masteringlaravel.io has so much more to offer.
From Competent to Confident | Mastering Laravel
A collection of resources to make you a better Laravel developer
masteringlaravel.io
We pin Composer packages and PHP versions, but what about PECL extensions? I hadn't been doing it, but I got burned by being too loose. masteringlaravel.io/daily/2025-1...
Don't forget to pin PECL extensions | Mastering Laravel
Just as important as Composer packages
masteringlaravel.io
November 12, 2025 at 1:53 PM
Docker is great for keeping project dependencies isolated and consistent, but it comes with a learning curve. Laravel Sail makes Docker easier, but adds another layer to understand. Here are two env-related warnings you might bump into. masteringlaravel.io/daily/2025-1...
A couple env-related warnings when using Laravel Sail | Mastering Laravel
And how to avoid them
masteringlaravel.io
November 11, 2025 at 2:45 PM
Just because two configuration settings seem to parallel each other, doesn't mean they actually work the same way. Symmetry doesn't always mean equality. Check out this example with Github actions triggers. masteringlaravel.io/daily/2025-1...
Understanding GitHub actions branch rules for pull requests and pushes | Mastering Laravel
A very important distinction
masteringlaravel.io
November 10, 2025 at 1:57 PM
If you have more than one domain pointing to the same Laravel application, you can easily configure your routes to only respond to specific domains. In today's video, I walk through how to do it. masteringlaravel.io/daily/2025-1...
How to route based on the requested domain | Mastering Laravel
Useful if you serve multiple sites out of the same Laravel app
masteringlaravel.io
November 7, 2025 at 1:19 PM
What if your base feature test class includes the RefreshDatabase trait, but you need to use DatabaseMigrations in one specific test class? PHP won't let us remove a trait, but here's how to accomplish the same thing. masteringlaravel.io/daily/2025-1...
How can you remove a trait from a base test class in Laravel? | Mastering Laravel
Or is this the wrong question?
masteringlaravel.io
November 6, 2025 at 2:15 PM
If you're integrating with a third-party API, you may not need to bring in a giant SDK. Sometimes writing a small custom client is a better approach. Laravel makes it pretty easy. masteringlaravel.io/daily/2025-1...
Do you really need to install that SDK? | Mastering Laravel
Or is there a better way?
masteringlaravel.io
November 5, 2025 at 1:24 PM
I use the RefreshDatabase trait in all my feature tests, but I ran into an issue with MySQL full-text searches that doesn't play nice with this trait. Here's why it's an issue and how to solve it. masteringlaravel.io/daily/2025-1...
A potential issue with full-text searches and Laravel feature tests | Mastering Laravel
And how to solve it
masteringlaravel.io
November 4, 2025 at 1:42 PM
How would you handle rebuilding a decade-old system with stale or missing specs? In this episode, we share a lightweight framework for agreeing on an MVP and negotiating trade-offs while making continual progress. masteringlaravel.io/daily/2025-1...
Rewriting without a map | Mastering Laravel
Shipping an MVP from a legacy app
masteringlaravel.io
November 3, 2025 at 12:49 PM
Have you ever been annoyed by losing development data when running your test suite? There's an easy solution, which I show in today's video. I do this on every single project. masteringlaravel.io/daily/2025-1...
Keep your testing database separate from development | Mastering Laravel
Understanding how phpunit.xml works opens up many possibilities
masteringlaravel.io
October 31, 2025 at 1:24 PM
It's a good practice to use placeholders when logging data in Laravel, but what if the data isn't a simple scalar value? Will it still work? masteringlaravel.io/daily/2025-1...
Can we log data with complex placeholders? | Mastering Laravel
Or only simple scalar types?
masteringlaravel.io
October 30, 2025 at 12:40 PM
We take pride in building things "the right way", but there is a balance to strike with simplicity. masteringlaravel.io/daily/2025-1...
Knowing when to keep it simple | Mastering Laravel
And not just an excuse to cut corners
masteringlaravel.io
October 29, 2025 at 2:04 PM
Have you ever wanted to step debug a test and run queries from your database client to see what's going on? Here's a simple way to see that uncommitted data. masteringlaravel.io/daily/2025-1...
How to read uncommitted data in your database tool while debugging a test | Mastering Laravel
Only one line of SQL needed
masteringlaravel.io
October 28, 2025 at 1:38 PM
I have my hunches as to why snake_case test methods seem to have caught on in Laravel projects, but today I make my argument for why we prefer camelCase anyways. masteringlaravel.io/daily/2025-1...
Why we like camel case test methods | Mastering Laravel
A surprisingly controversial opinion in the Laravel world
masteringlaravel.io
October 27, 2025 at 11:40 AM
Sometimes we have to run into a problem ourselves to really understand why certain common programming advice is given. For example, why shouldn't you rely on the ordering of JSON keys? Let me demonstrate in today's video. masteringlaravel.io/daily/2025-1...
Don't rely on key ordering with MySQL JSON values | Mastering Laravel
This behavior caught me by surprise
masteringlaravel.io
October 24, 2025 at 1:09 PM
AWS has so many options, which is both great at times and overwhelming at others. For example, how would you set up traditional bounce logging with Amazon SES? Here's a solution I landed on after trying several. masteringlaravel.io/daily/2025-1...
Setting up Amazon SES email bounce logging | Mastering Laravel
So many different options
masteringlaravel.io
October 23, 2025 at 1:42 PM
I recently talked about why I like writing one-time commands. I also talk about the value of writing tests. What about writing tips for one-time commands? masteringlaravel.io/daily/2025-1...
Should we write tests for this one-time command? | Mastering Laravel
I'm a huge proponent of writing tests, but is there ever a valid time to skip them?
masteringlaravel.io
October 22, 2025 at 1:10 PM
In a previous tip, I questioned the value of overriding coding standards locally. The creator of PHP CS Fixer shared with me a different reason the tool allows local override. masteringlaravel.io/daily/2025-1...
A valid reason to override coding standards locally | Mastering Laravel
A follow up to a previous tip
masteringlaravel.io
October 21, 2025 at 12:52 PM
We work on a variety of client projects, and we often help teams level up their project standards. In this episode of the No Compromises podcast, we discuss how to do this with a composable library of tool-specific, versioned configs. masteringlaravel.io/daily/2025-1...
A composable, versioned toolkit for Laravel projects | Mastering Laravel
How can we make it better?
masteringlaravel.io
October 20, 2025 at 12:52 PM
I like consistency. I talk about it a lot in these tips, because it lets me focus on the important decisions in my work. In today's video, I show an example with this when it comes to running composer scripts. masteringlaravel.io/daily/2025-1...
Be consistent with composer scripts in CI | Mastering Laravel
Reduce friction
masteringlaravel.io
October 17, 2025 at 1:23 PM
Virtual-hosted vs path-style S3 URLs might seem like a trivial choice, but AWS has strong opinions about it. Here's how to handle both local development and production the Laravel way. masteringlaravel.io/daily/2025-1...
Should I use path-style or virtual hosted-style S3 URLs? | Mastering Laravel
And what is the difference?
masteringlaravel.io
October 16, 2025 at 1:52 PM
Is there any reason to build a Laravel command you only plan to use one time? Let's consider a few benefits. masteringlaravel.io/daily/2025-1...
The benefit of one-time commands | Mastering Laravel
Not a waste of effort
masteringlaravel.io
October 15, 2025 at 1:13 PM
Running tests in production might seem like the ultimate confidence booster, but it's actually a disaster waiting to happen. Let me explain why I keep my test suite far away from production servers. masteringlaravel.io/daily/2025-1...
Why I would not run tests in production | Mastering Laravel
Risks outweigh the benefits
masteringlaravel.io
October 14, 2025 at 1:19 PM
I'm always open to changing my mind, even on long-standing development practices. Recently, I got a support request from a new consumer of an API I built, and it give me a little pause to reconsider how we enforce headers. masteringlaravel.io/daily/2025-1...
Should I relax my API's Accept header requirements? | Mastering Laravel
Would it solve a problem?
masteringlaravel.io
October 13, 2025 at 2:57 PM
Regexes in search logic are powerful, but this tip will supercharge your code searching without needing to get too fancy. Watch the video to see how to quickly do a search within a search in PHPStorm. masteringlaravel.io/daily/2025-1...
Easily find specific code usages in PhpStorm without regex | Mastering Laravel
Very handy to know
masteringlaravel.io
October 10, 2025 at 3:11 PM
Today I want to share why we override the default value for the stopOnError attribute in our PHPUnit configuration, especially when running tests in CI pipelines. masteringlaravel.io/daily/2025-1...
Why we like stopOnError in our test suite | Mastering Laravel
Especially nice for CI pipelines
masteringlaravel.io
October 9, 2025 at 1:34 PM