O Mariastan é uma ferramenta de análise estática para consultas de mariadb. Seu objetivo principal é servir de base para as extensões do Phpstan.
Status atual (24. 04. 2024):
O Mariastan é muito incompleto. Ele cobre provavelmente ~ 90% dos casos de uso em uma grande base de código onde eu a uso (centenas de tabelas, milhares de consultas). Como resultado, não há muita atividade. Mas é mantido ativamente no sentido de que, se algo quebrar para mim, provavelmente será consertado.
Se você tentar usá-lo em seu projeto, é provável que você se deparar com casos de uso que não são implementados (por exemplo, sintaxe/funções que meu projeto não usa). Se isso acontecer, você deve estar preparado para consertar as coisas para si mesmo (a maioria das coisas deve ser fácil).
Não há promessa de compatibilidade com antecedência em nada, e não há lançamentos - eu apenas uso o mestre.
O Mariastan é testado com MariaDB 10.11 e Php 8.1-8.3.
Instale o mariastante usando composer require --dev schlndh/maria-stan:dev-master . Então você precisará adicionar o seguinte ao seu phpstan.neon :
includes :
- ./vendor/schlndh/maria-stan/extension.neon
O Mariastan precisa de acesso ao esquema do banco de dados. A maneira mais fácil de fornecê -lo é deixá -lo conectar diretamente a um banco de dados. Você precisará adicionar a seguinte configuração ao seu phpstan.neon e definir credenciais adequadas:
parameters :
maria-stan :
db :
# Change these to match your database
host : 127.0.0.1
port : 3306
user : ' root '
password : ' '
database : ' db 'O Mariastan precisa de acesso a um banco de dados para buscar o esquema para análise de consulta. Ele apenas lê esquema de tabela e não escreve nada. No entanto, não forneça acesso a nenhum banco de dados que contenha dados importantes.
Como alternativa, também é possível usar o mariastante sem acesso ao banco de dados durante a análise. Nesse caso, você precisará primeiro despejar o esquema usando MariaDbFileDbReflection::dumpSchema e salvá -lo em um arquivo. Aqui está um exemplo de script que faz isso:
<?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 ' )); Em seguida, adicione o seguinte ao seu phpstan.neon :
parameters :
maria-stan :
reflection :
file : %rootDir%/../../../maria-stan-schema.dump
services :
mariaDbReflection : @ mariaDbFileDbReflectionObserve que a expansão automática de caminhos relativos funciona apenas com a própria configuração do Phpstan (ou seja, é uma lista codificada de teclas de configuração). Portanto, você terá que fornecer um caminho absoluto para o arquivo de despejo.
Consulte extension.neon para obter uma lista completa de parâmetros.
O Mariastan inclui uma extensão de phpstan de amostra para MySqli. No entanto, o objetivo desta extensão é simplesmente verificar a integração com o Phpstan. Não espero que ninguém use MySqli diretamente. Portanto, espera -se que você escreva sua própria extensão do Phpstan que se integra ao Mariastan. Se você deseja usar a extensão mysqli, inclua ./vendor/schlndh/maria-stan/extension.mysqli.neon em seu phpstan.neon .
Você pode usar a extensão MySQLI como ponto de partida e modificá -lo para atender às suas necessidades. A idéia básica é obter a sequência de consultas do Phpstan, passar para o Mariastan para análise e, em seguida, relatar tipos de resultados e erros de volta ao Phpstan.
Antes de começar a implementar sua própria extensão para integrar o Mariastan ao seu projeto, você pode experimentá -lo rapidamente. Você pode começar verificando um exemplo simples que usa a extensão MySQLI. Em seguida, você pode tentar chamar consultas da sua base de código via MySQLI e analisá -las com a extensão MySQLI para garantir que o Mariastan suporte os recursos que seus projetos usa.
Aqui está uma lista de recursos que você pode implementar em sua própria extensão do Phpstan com base no mariastão (a maioria deles deve ser demonstrada na extensão MySqli):
mysqli_result::fetch_fields ). Isso ocorre porque o Mariastan pode (em casos simples) entender consultas como SELECT col FROM tbl WHERE col IS NOT NULL NULL .INSERT / REPLACESELECT COUNT(*) FROM tbl ), que pode ser usada para diminuir o tipo de retorno de métodos como mysqli_result::fetch_all (ou seja, non-empty-array ). function foo ( mysqli $ db , int $ count ) {
return $ db -> prepare ( " SELECT * FROM tbl WHERE id IN ( " . implode ( ' , ' , array_fill ( 0 , $ count , ' ? ' )) . ' ) ' );
}Até onde eu sei, o Phpstan-DBA funciona executando as consultas para obter as informações sobre tipos de resultados, erros, ... O mariastante, por outro lado, analisa as consultas estaticamente. Os benefícios do Phpstan-DBA incluem:
Existem algumas desvantagens menores na abordagem do Phpstan-DBA:
information_schema , não necessariamente no tempo de análise). Mas é possível implementar CREATE TABLE (etc.) analisar e implementar uma reflexão de banco de dados sobre isso.SELECT consultas em vários lugares, bem como o uso de transações. Portanto, não tenho certeza de quão bem ele suporta INSERT etc. (pelo menos existem alguns testes).