Mariastán es una herramienta de análisis estático para consultas de mariadb. Su propósito principal es servir como base para las extensiones de Phpstan.
Estado actual (24. 04. 2024):
Mariastán está muy incompleta. Cubre probablemente ~ 90% de los casos de uso en una gran base de código donde lo uso (cientos de tablas, miles de consultas). Como resultado, no hay mucha actividad. Pero se mantiene activamente en el sentido de que si algo se rompe para mí probablemente se solucionará.
Si intenta usarlo en su proyecto, es probable que se encuentre con casos de uso que no se implementan (por ejemplo, sintaxis/funciones que mi proyecto no usa). Si eso sucede, debe estar preparado para arreglar las cosas (la mayoría de las cosas deberían ser fáciles).
No hay una promesa de compatibilidad hacia atrás en nada, y no hay lanzamientos, solo uso el maestro.
Mariastán se prueba con MariaDB 10.11 y PHP 8.1-8.3.
Instale Mariastan usando composer require --dev schlndh/maria-stan:dev-master . Entonces deberá agregar lo siguiente a su phpstan.neon :
includes :
- ./vendor/schlndh/maria-stan/extension.neon
Mariastan necesita acceso al esquema de la base de datos. La forma más fácil de proporcionarlo es dejar que se conecte directamente a una base de datos. Deberá agregar la siguiente configuración a su phpstan.neon y establecer las credenciales adecuadas:
parameters :
maria-stan :
db :
# Change these to match your database
host : 127.0.0.1
port : 3306
user : ' root '
password : ' '
database : ' db 'Mariastan necesita acceso a una base de datos para obtener el esquema para el análisis de consultas. Solo lee el esquema de la tabla y no escribe nada. Sin embargo, no le dé acceso a ninguna base de datos que contenga datos importantes.
Alternativamente, también es posible usar Mariastán sin acceso a la base de datos durante el análisis. En ese caso, primero deberá volcar el esquema usando MariaDbFileDbReflection::dumpSchema y guardarlo en un archivo. Aquí hay un script de ejemplo que hace eso:
<?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 ' )); Luego agregue lo siguiente a su phpstan.neon :
parameters :
maria-stan :
reflection :
file : %rootDir%/../../../maria-stan-schema.dump
services :
mariaDbReflection : @ mariaDbFileDbReflectionTenga en cuenta que la expansión automática de rutas relativas solo funciona con la propia configuración de Phpstan (es decir, es una lista codificada de claves de configuración). Por lo tanto, tendrá que proporcionar una ruta absoluta al archivo de volcado.
Consulte extension.neon para una lista completa de parámetros.
Mariastán incluye una muestra de extensión de Phpstan para MySQLI. Sin embargo, el propósito de esta extensión es simplemente verificar la integración con PHPSTAN. No espero que nadie use MySQLi directamente. Por lo tanto, se espera que escriba su propia extensión de Phpstan que se integra con Mariastán. Si desea utilizar la extensión MySQLI incluye ./vendor/schlndh/maria-stan/extension.mysqli.neon en su phpstan.neon .
Puede usar la extensión MySQLI como punto de partida A Modifique que coincida con sus necesidades. La idea básica es obtener la cadena de consulta de Phpstan, pasarla a Mariastán para su análisis y luego informar los tipos de resultados y los errores a PHPSTAN.
Antes de comenzar a implementar su propia extensión para integrar a Mariastán en su proyecto, puede probarlo rápidamente. Puede comenzar revisando un ejemplo simple que usa la extensión MySQLI. Luego, puede intentar llamar a las consultas desde su base de código a través de MySQLI y analizarlas con la extensión MySQLI para asegurarse de que Mariastan admite las características que sus proyectos utilizan.
Aquí hay una lista de características que puede implementar en su propia extensión de Phpstan basada en Mariastán (la mayoría de ellas deben demostrarse en la extensión MySQLI):
mysqli_result::fetch_fields ). Esto se debe a que Mariastán puede (en casos simples) comprender consultas como SELECT col FROM tbl WHERE col IS NOT NULL y eliminar el NULL del tipo de resultado, mientras que MariadB no parece hacer eso.INSERT / REPLACESELECT COUNT(*) FROM tbl ) que puede usarse para reducir el tipo de retorno de métodos como mysqli_result::fetch_all (es decir, non-empty-array ). function foo ( mysqli $ db , int $ count ) {
return $ db -> prepare ( " SELECT * FROM tbl WHERE id IN ( " . implode ( ' , ' , array_fill ( 0 , $ count , ' ? ' )) . ' ) ' );
}Por lo que puedo decir, Phpstan-DBA trabaja ejecutando las consultas para obtener la información sobre los tipos de resultados, los errores, ... Mariastán, por otro lado, analiza las consultas estáticamente. Los beneficios de Phpstan-DBA incluyen:
Hay algunas desventajas menores para el enfoque de Phpstan-DBA:
information_schema , no necesariamente en el tiempo de análisis). Pero es posible implementar el análisis CREATE TABLE (etc.) e implementar una reflexión de DB sobre eso.SELECT en varios lugares, así como el uso de transacciones. Por lo tanto, no estoy seguro de qué tan bien admite INSERT etc. (al menos hay algunas en las pruebas).