We recently used Shift to upgrade our codebase to Laravel 13. One thing I appreciate about Shift is that it doesn't just bump version numbers, it also updates your code to embrace newer patterns.
For example, it converted our $fillable model properties to the new #[Fillable] PHP attribute.
While reviewing the diff, I noticed one change I wanted to revert.
Our Payment model had a deliberately empty $fillable.
protected $fillable = []; // nothing is fillable
Every payment is built programmatically through our own code. Mass assignment was not something we ever needed, and the comment was there to communicate that to anyone reading the model.
Shift saw that our empty array was the same as the model default, so it removed it. While removing it didn't change any behavior, I wanted the intent back in the code (with our comment), so I added the equivalent attribute manually.
My first attempt was a bare attribute, but it triggered a PHP warning.
#[Fillable] // undefined array key 0
Looking at the attribute's constructor explains why.
It accepts a variadic ...$columns and unconditionally reads $columns[0], so passing nothing leaves it reaching into an empty array.
The fix is to be explicit with an empty array.
#[Fillable([])] // nothing is fillable
Now the intent is back where it belongs, no warning is emitted, and we have our comment to help any future dev understand why.
Here to help,
Joel
P.S. Subtle details like this are easy to skim past in a big upgrade diff. A fresh set of eyes is what catches them. Schedule a code review.