MariAtan est un outil d'analyse statique pour les requêtes mariaDB. Son objectif principal est de servir de base aux extensions de phpstan.
État actuel (24. 04. 2024):
MariAtan est très incomplet. Il couvre probablement ~ 90% des cas d'utilisation dans une grande base de code où je l'utilise (centaines de tables, milliers de requêtes). En conséquence, il n'y a pas beaucoup d'activité. Mais il est activement maintenu dans le sens où si quelque chose se casse pour moi, il sera probablement réparé.
Si vous essayez de l'utiliser dans votre projet, vous êtes susceptible de rencontrer des cas d'utilisation qui ne sont pas implémentés (par exemple, syntaxe / fonctions que mon projet n'utilise pas). Si cela se produit, vous devez être prêt à réparer les choses par vous-même (la plupart des choses devraient être faciles).
Il n'y a pas de promesse de compatibilité arrière sur quoi que ce soit, et il n'y a pas de versions - j'utilise juste Master.
MariAtan est testé avec MariaDB 10.11 et PHP 8.1-8.3.
Installez MariAtan à l'aide composer require --dev schlndh/maria-stan:dev-master . Alors vous devrez ajouter ce qui suit à votre phpstan.neon :
includes :
- ./vendor/schlndh/maria-stan/extension.neon
MariAtan a besoin d'accéder au schéma de base de données. Le moyen le plus simple de le fournir est de le laisser se connecter directement à une base de données. Vous devrez ajouter la configuration suivante à votre phpstan.neon et définir les informations d'identification appropriées:
parameters :
maria-stan :
db :
# Change these to match your database
host : 127.0.0.1
port : 3306
user : ' root '
password : ' '
database : ' db 'MariAtan a besoin d'accéder à une base de données pour récupérer le schéma d'analyse de requête. Il ne lit que le schéma de table et n'écrit rien. Néanmoins, ne lui donnez pas accès à une base de données contenant des données importantes.
Alternativement, il est également possible d'utiliser MariAtan sans accès à la base de données pendant l'analyse. Dans ce cas, vous devrez d'abord vider le schéma à l'aide de MariaDbFileDbReflection::dumpSchema et l'enregistrer dans un fichier. Voici un exemple de script qui fait cela:
<?php
declare (strict_types= 1 );
use MariaStan DbReflection MariaDbFileDbReflection ;
require_once __DIR__ . ' /vendor/autoload.php ' ;
$ mysqli = new mysqli ( ' 127.0.0.1 ' , ' root ' , '' );
file_put_contents ( __DIR__ . ' /maria-stan-schema.dump ' , MariaDbFileDbReflection:: dumpSchema ( $ mysqli , ' database ' )); Puis ajoutez ce qui suit à votre phpstan.neon :
parameters :
maria-stan :
reflection :
file : %rootDir%/../../../maria-stan-schema.dump
services :
mariaDbReflection : @ mariaDbFileDbReflectionNotez que l'expansion automatique des chemins relatives ne fonctionne qu'avec la configuration de PhpStan (c'est-à-dire qu'il s'agit d'une liste de touches de configuration codées en dur). Vous devrez donc fournir un chemin absolu vers le fichier de vidage.
Voir extension.neon pour une liste complète des paramètres.
MariAtan comprend un exemple d'extension PHPSTAN pour MySQLI. Cependant, le but de cette extension est simplement de vérifier l'intégration avec le phpstan. Je ne m'attends pas à ce que quelqu'un utilise directement MySQLI directement. Par conséquent, vous devez écrire votre propre extension phpstan qui s'intègre à MariAtan. Si vous souhaitez utiliser l'extension mysqli, incluez ./vendor/schlndh/maria-stan/extension.mysqli.neon dans votre phpstan.neon .
Vous pouvez utiliser l'extension MySQLI comme point de départ A le modifier pour répondre à vos besoins. L'idée de base est d'obtenir la chaîne de requête de PHPSTAN, de la transmettre à MariAtan pour l'analyse, puis de signaler les types de résultats et les erreurs à PHPSTAN.
Avant de commencer à mettre en œuvre votre propre extension pour intégrer MariAtan dans votre projet, vous pouvez rapidement l'essayer. Vous pouvez commencer par consulter un exemple simple qui utilise l'extension MySQLI. Ensuite, vous pouvez essayer d'appeler les requêtes à partir de votre base de code via MySQLI et les analyser avec l'extension MySQLI pour vous assurer que MariAtan prend en charge les fonctionnalités que vos projets utilisent.
Voici une liste de fonctionnalités que vous pourriez mettre en œuvre dans votre propre extension PHPSTAN basée sur MariAtan (la plupart d'entre elles devraient être démontrées dans l'extension MySQLI):
mysqli_result::fetch_fields ). En effet, MariAtan peut (dans les cas simples) comprendre les requêtes comme SELECT col FROM tbl WHERE col IS NOT NULL et supprimer le NULL du type de résultat, tandis que MariADB ne semble pas le faire.INSERT / REPLACESELECT COUNT(*) FROM tbl ) qui peut être utilisé pour réduire le type de retour des méthodes comme mysqli_result::fetch_all (c'est non-empty-array ). function foo ( mysqli $ db , int $ count ) {
return $ db -> prepare ( " SELECT * FROM tbl WHERE id IN ( " . implode ( ' , ' , array_fill ( 0 , $ count , ' ? ' )) . ' ) ' );
}Pour autant que je sache, PHPSTAN-DBA fonctionne en exécutant les requêtes pour obtenir les informations sur les types de résultats, les erreurs, ... MariAtan, d'autre part, analyse les requêtes statiquement. Les avantages du phpstan-dbA comprennent:
Il y a quelques inconvénients mineurs à l'approche de Phpstan-DBA:
information_schema , pas nécessairement au moment de l'analyse). Mais il est possible d'implémenter CREATE TABLE (etc.) analyse et implémenter une réflexion DB en plus de cela.SELECT les requêtes à plusieurs endroits, ainsi que l'utilisation des transactions. Par conséquent, je ne sais pas à quel point il prend en charge INSERT , etc. (il y en a au moins dans les tests).