PHPStan based SQL static analysis and type inference for the database access layer
phpstan-dba
: PHPStan based SQL static analysis and type inference for the database access layerphpstan-dba
makes your phpstan static code analysis jobs aware of datatypes within your database.
With this information at hand we are able to detect type inconsistencies between your domain model and database-schema.
Additionally errors in code handling the results of sql queries can be detected.
This extension provides the following features, as long as you stick to the rules:
doctrine/dbal
, mysqli
, and PDO
In case you are using Doctrine ORM, you might use phpstan-dba
in tandem with phpstan-doctrine.
[!NOTE]
At the moment only MySQL/MariaDB and PGSQL databases are supported. Technically it’s not a big problem to support other databases though.
phpstan-dba - check your sql queries like a boss
May 2023, at PHP Usergroup in Frankfurt Main (Germany).
see the ‘Files Changed’ tab of the DEMO-PR for a quick glance.
Consider supporting the project, so we can make this tool even better even faster for everyone.
First, use composer to install:
composer require --dev staabm/phpstan-dba
Second, create a phpstan-dba-bootstrap.php
file, which allows to you to configure phpstan-dba
(this optionally includes database connection details, to introspect the database; if you would rather not do this see Record and Replay:
<?php // phpstan-dba-bootstrap.php
use staabm\PHPStanDba\DbSchema\SchemaHasherMysql;
use staabm\PHPStanDba\QueryReflection\RuntimeConfiguration;
use staabm\PHPStanDba\QueryReflection\MysqliQueryReflector;
use staabm\PHPStanDba\QueryReflection\QueryReflection;
use staabm\PHPStanDba\QueryReflection\ReplayAndRecordingQueryReflector;
use staabm\PHPStanDba\QueryReflection\ReplayQueryReflector;
use staabm\PHPStanDba\QueryReflection\ReflectionCache;
require_once __DIR__ . '/vendor/autoload.php';
$cacheFile = __DIR__.'/.phpstan-dba.cache';
$config = new RuntimeConfiguration();
// $config->debugMode(true);
// $config->stringifyTypes(true);
// $config->analyzeQueryPlans(true);
// $config->utilizeSqlAst(true);
// TODO: Put your database credentials here
$mysqli = new mysqli('hostname', 'username', 'password', 'database');
QueryReflection::setupReflector(
new ReplayAndRecordingQueryReflector(
ReflectionCache::create(
$cacheFile
),
// XXX alternatively you can use PdoMysqlQueryReflector instead
new MysqliQueryReflector($mysqli),
new SchemaHasherMysql($mysqli)
),
$config
);
[!NOTE]
Configuration for PGSQL is pretty similar
Third, create or update your phpstan.neon
file so bootstrapFiles includes phpstan-dba-bootstrap.php
.
If you are not using phpstan/extension-installer, you will also need to include dba.neon
.
Your phpstan.neon
might look something like:
parameters:
level: 8
paths:
- src/
bootstrapFiles:
- phpstan-dba-bootstrap.php
includes:
- ./vendor/staabm/phpstan-dba/config/dba.neon
Finally, run phpstan
, e.g.
./vendor/bin/phpstan analyse -c phpstan.neon