Mariastan ist ein statisches Analyse -Tool für Mariadb -Abfragen. Sein Hauptzweck ist es, als Grundlage für Phpstan -Erweiterungen zu dienen.
Aktueller Status (24. 04. 2024):
Mariastan ist sehr unvollständig. Es deckt wahrscheinlich ~ 90% der Anwendungsfälle in einer großen Code-Basis ab, in der ich es verwende (Hunderte von Tabellen, Tausende von Abfragen). Infolgedessen gibt es nicht viel Aktivität. Aber es wird aktiv in dem Sinne aufrechterhalten, dass es wahrscheinlich repariert wird, wenn etwas für mich bricht.
Wenn Sie versuchen, es in Ihrem Projekt zu verwenden, werden Sie wahrscheinlich nicht implementiert (z. B. Syntax/Funktionen, die mein Projekt nicht verwendet). In diesem Fall sollten Sie bereit sein, Dinge für sich selbst zu reparieren (die meisten Dinge sollten einfach sein).
Auf irgendetwas gibt es kein Versprechen nach hinten, und es gibt keine Veröffentlichungen - ich benutze nur Master.
Mariastan wird mit Mariadb 10.11 und PHP 8.1-8.3 getestet.
Installieren Sie Mariastan mit composer require --dev schlndh/maria-stan:dev-master . Dann müssen Sie Ihrem phpstan.neon Folgendes hinzufügen:
includes :
- ./vendor/schlndh/maria-stan/extension.neon
Mariastan braucht Zugriff auf das Datenbankschema. Der einfachste Weg, es bereitzustellen, besteht darin, es direkt zu einer Datenbank herzustellen. Sie müssen die folgende Konfiguration zu Ihrem phpstan.neon hinzufügen und ordnungsgemäße Anmeldeinformationen festlegen:
parameters :
maria-stan :
db :
# Change these to match your database
host : 127.0.0.1
port : 3306
user : ' root '
password : ' '
database : ' db 'Mariastan braucht Zugriff auf eine Datenbank, um das Schema für die Abfrageanalyse abzurufen. Es liest nur das Tabellenschema und schreibt nichts. Geben Sie jedoch keinen Zugriff auf eine Datenbank, die wichtige Daten enthält.
Alternativ ist es auch möglich, Mariastan während der Analyse ohne Zugriff auf die Datenbank zu verwenden. In diesem Fall müssen Sie das Schema zuerst mit MariaDbFileDbReflection::dumpSchema abwerfen und in einer Datei speichern. Hier ist ein Beispielskript, das das tut:
<?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 ' )); Fügen Sie dann Folgendes zu Ihrem phpstan.neon hinzu:
parameters :
maria-stan :
reflection :
file : %rootDir%/../../../maria-stan-schema.dump
services :
mariaDbReflection : @ mariaDbFileDbReflectionBeachten Sie, dass die automatische Erweiterung der relativen Pfade nur mit der eigenen Konfiguration von Phpstan funktioniert (dh es handelt sich um eine hartcodierte Liste von Konfigurationsschlüssel). Sie müssen also einen absoluten Weg zur Dump -Datei bieten.
Eine vollständige Liste von Parametern finden Sie in extension.neon .
Mariastan enthält eine Probe -Phpstan -Erweiterung für MySQLI. Der Zweck dieser Erweiterung ist jedoch lediglich die Überprüfung der Integration in Phpstan. Ich erwarte nicht, dass jemand MySQLI tatsächlich direkt verwendet. Aus diesem Grund wird erwartet, dass Sie Ihre eigene Phpstan -Erweiterung schreiben, die sich in Mariastan integriert. Wenn Sie die MySQLI-Erweiterung verwenden möchten, inklusive ./vendor/schlndh/maria-stan/extension.mysqli.neon in Ihrem phpstan.neon .
Sie können die MySQLI -Erweiterung als Ausgangspunkt A verwenden, um sie zu Ihren Anforderungen zu entsprechen. Die Grundidee besteht darin, die Abfragezeichenfolge von Phpstan zu erhalten, sie für die Analyse an Mariastan weiterzugeben und dann Ergebnistypen und Fehler an Phpstan zurück zu melden.
Bevor Sie Ihre eigene Erweiterung implementieren, um Mariastan in Ihr Projekt zu integrieren, können Sie es schnell ausprobieren. Sie können zunächst ein einfaches Beispiel überprüfen, das die MySQLI -Erweiterung verwendet. Anschließend können Sie versuchen, Abfragen von Ihrem Codebasis über MySQLI anzurufen und sie mit der MySQLI -Erweiterung zu analysieren, um sicherzustellen, dass Mariastan die Funktionen, die Ihre Projekte verwenden, unterstützt.
Hier finden Sie eine Liste von Funktionen, die Sie in Ihrer eigenen Phpstan -Erweiterung basierend auf Mariastan implementieren können (die meisten sollten in der MySQLI -Erweiterung demonstriert werden):
mysqli_result::fetch_fields ). Dies liegt daran, dass Mariastan (in einfachen Fällen) Abfragen wie SELECT col FROM tbl WHERE col IS NOT NULL und den NULL aus dem Ergebnistyp entfernen, während Mariadb dies nicht zu tun scheint.INSERT / REPLACESELECT COUNT(*) FROM tbl ) fest, mit der die Rückgabetypen wie mysqli_result::fetch_all (dh non-empty-array ) eingrenzt werden kann. function foo ( mysqli $ db , int $ count ) {
return $ db -> prepare ( " SELECT * FROM tbl WHERE id IN ( " . implode ( ' , ' , array_fill ( 0 , $ count , ' ? ' )) . ' ) ' );
}Soweit ich das beurteilen kann, arbeitet Phpstan-DBA mit der Ausführung der Abfragen, um die Informationen zu Ergebnistypen, Fehlern, ... Mariastan auf der anderen Seite zu erhalten. Zu den Vorteilen von Phpstan-DBA gehören:
Es gibt einige kleinere Nachteile des Ansatzes von Phpstan-DBA:
information_schema abzurufen, nicht unbedingt zum Analysezeitpunkt). Es ist jedoch möglich, eine DB -Reflexion zu implementieren, CREATE TABLE (usw.) implementieren und eine DB -Reflexion implementieren.SELECT . Daher bin ich mir nicht sicher, wie gut es INSERT usw. unterstützt usw. (zumindest in Tests gibt es einige in Tests).