If you've ever used PHPStan in a Laravel project, you might have been frustrated at how certain types are resolved.
A common complaint is with the authenticated user.
A simple call like $request->user() will evaluate as returning mixed, and Auth::user() will evaluate as Illuminate\Contracts\Auth\Authenticatable|null.
Neither of these are helpful if you want to go on and use that return type as a User model.
To be clear, this is not a problem with PHPStan, but rather with how the Laravel types are actually expressed in the framework code.
The solution is easy, though: Install Larastan instead of PHPStan. It brings in PHPStan along with a set of extensions specifically for Laravel.
One important note: Just installing the package isn't enough.
You need to also add Larastan's extension to your phpstan.neon configuration file.
With that installed, both $request->user() and Auth::user() will be properly recognized as returning your User model.
Even better, if you have a different model or guard set up in your config/auth.php, Larastan is smart enough to resolve that instead.
And this is just one of dozens of Laravel-specific improvements that Larastan provides over vanilla PHPStan.
Here to help,
Joel
P.S. I've helped a lot of teams get started with static analysis in Laravel projects. Would you like help on your project?