Skip to content

Instantly share code, notes, and snippets.

@ianrodrigues
Created September 26, 2026 11:07
Show Gist options
  • Select an option

  • Save ianrodrigues/7561231075384284a11e6b08eb7db51e to your computer and use it in GitHub Desktop.

Select an option

Save ianrodrigues/7561231075384284a11e6b08eb7db51e to your computer and use it in GitHub Desktop.
PHPStan leveraging `spaze/phpstan-disallowed-calls`
includes:
- vendor/larastan/larastan/extension.neon
- vendor/nesbot/carbon/extension.neon
- vendor/spaze/phpstan-disallowed-calls/extension.neon
parameters:
phpVersion: 80500
checkAuthCallsWhenInRequestScope: true
checkConfigTypes: true
parseModelCastsMethod: true
tmpDir: storage/framework/cache/phpstan
paths:
- app/
- bootstrap/app.php
- config/
- database/
- routes/
level: max
disallowedMethodCalls:
-
method:
- 'App\Models\*::decrement()'
- 'App\Models\*::increment()'
- 'Illuminate\Database\Eloquent\Model::decrement()'
- 'Illuminate\Database\Eloquent\Model::decrementQuietly()'
- 'Illuminate\Database\Eloquent\Model::delete()'
- 'Illuminate\Database\Eloquent\Model::deleteOrFail()'
- 'Illuminate\Database\Eloquent\Model::deleteQuietly()'
- 'Illuminate\Database\Eloquent\Model::fill()'
- 'Illuminate\Database\Eloquent\Model::forceDelete()'
- 'Illuminate\Database\Eloquent\Model::forceFill()'
- 'Illuminate\Database\Eloquent\Model::increment()'
- 'Illuminate\Database\Eloquent\Model::incrementQuietly()'
- 'Illuminate\Database\Eloquent\Model::push()'
- 'Illuminate\Database\Eloquent\Model::pushQuietly()'
- 'Illuminate\Database\Eloquent\Model::save()'
- 'Illuminate\Database\Eloquent\Model::saveOrFail()'
- 'Illuminate\Database\Eloquent\Model::saveQuietly()'
- 'Illuminate\Database\Eloquent\Model::touch()'
- 'Illuminate\Database\Eloquent\Model::touchQuietly()'
- 'Illuminate\Database\Eloquent\Model::update()'
- 'Illuminate\Database\Eloquent\Model::updateOrFail()'
- 'Illuminate\Database\Eloquent\Model::updateQuietly()'
message: 'change model state through an intention-named model method'
allowInInstanceOf:
- 'Illuminate\Database\Eloquent\Model'
allowIn:
- database/*
-
method:
- 'Illuminate\Database\Eloquent\Builder::decrement()'
- 'Illuminate\Database\Eloquent\Builder::decrementEach()'
- 'Illuminate\Database\Eloquent\Builder::delete()'
- 'Illuminate\Database\Eloquent\Builder::forceDelete()'
- 'Illuminate\Database\Eloquent\Builder::increment()'
- 'Illuminate\Database\Eloquent\Builder::incrementEach()'
- 'Illuminate\Database\Eloquent\Builder::insert()'
- 'Illuminate\Database\Eloquent\Builder::insertGetId()'
- 'Illuminate\Database\Eloquent\Builder::insertOrIgnore()'
- 'Illuminate\Database\Eloquent\Builder::touch()'
- 'Illuminate\Database\Eloquent\Builder::update()'
- 'Illuminate\Database\Eloquent\Builder::updateOrCreate()'
- 'Illuminate\Database\Eloquent\Builder::updateOrInsert()'
- 'Illuminate\Database\Eloquent\Builder::upsert()'
message: 'bulk writes bypass model invariants; move them into a model method'
allowInInstanceOf:
- 'Illuminate\Database\Eloquent\Model'
allowIn:
- database/*
-
method:
- 'Illuminate\Database\Eloquent\Relations\BelongsToMany::detach()'
- 'Illuminate\Database\Eloquent\Relations\BelongsToMany::sync()'
- 'Illuminate\Database\Eloquent\Relations\BelongsToMany::syncWithPivotValues()'
- 'Illuminate\Database\Eloquent\Relations\BelongsToMany::syncWithoutDetaching()'
- 'Illuminate\Database\Eloquent\Relations\BelongsToMany::toggle()'
- 'Illuminate\Database\Eloquent\Relations\BelongsToMany::updateExistingPivot()'
- 'Illuminate\Database\Eloquent\Relations\BelongsToMany::updateOrCreate()'
- 'Illuminate\Database\Eloquent\Relations\HasOneOrMany::updateOrCreate()'
message: 'relation writes bypass model invariants; move them into a model method'
allowInInstanceOf:
- 'Illuminate\Database\Eloquent\Model'
allowIn:
- database/*
disallowedClasses:
-
class:
- 'DomainException'
- 'Exception'
- 'RuntimeException'
message: 'throw an application exception from app/Exceptions'
allowExceptIn:
- app/Actions/*
- app/Models/*
- app/Queries/*
disallowedStaticCalls:
-
method:
- 'Illuminate\Database\Eloquent\Model::destroy()'
message: 'change model state through an intention-named model method'
allowInInstanceOf:
- 'Illuminate\Database\Eloquent\Model'
allowIn:
- database/*
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment