Mariastan - это статический инструмент анализа для запросов MariaDB. Его основная цель - служить основой для расширений PHPSTAN.
Текущий статус (24. 04. 2024):
Мариастан очень неполный. Он охватывает, вероятно, ~ 90% случаев использования в большой кодовой базе, где я использую его (сотни таблиц, тысячи запросов). В результате не так много активности. Но это активно поддерживается в том смысле, что если что -то сломается для меня, это, вероятно, будет исправлено.
Если вы попытаетесь использовать его в своем проекте, вы, скорее всего, столкнетесь с CASES, которые не реализованы (например, синтаксис/функции, которые мой проект не использует). Если это произойдет, вы должны быть готовы исправить что -то для себя (большинство вещей должно быть легко).
Нет никаких обещаний к обратном совместимости ни о чем, и нет никаких релизов - я просто использую Master.
Mariastan проверяется с MariaDB 10.11 и PHP 8.1-8.3.
Установите Mariastan, используя composer require --dev schlndh/maria-stan:dev-master . Затем вам нужно добавить следующее к вашему phpstan.neon :
includes :
- ./vendor/schlndh/maria-stan/extension.neon
Mariastan нуждается в доступе к схеме базы данных. Самый простой способ обеспечить его - это позволить ему подключиться непосредственно к базе данных. Вам нужно будет добавить следующую конфигурацию в свой phpstan.neon и установить правильные учетные данные:
parameters :
maria-stan :
db :
# Change these to match your database
host : 127.0.0.1
port : 3306
user : ' root '
password : ' '
database : ' db 'Mariastan нуждается в доступе к базе данных, чтобы получить схему для анализа запросов. Он только читает схему таблицы и ничего не пишет. Тем не менее, не дайте ему доступ к какой -либо базе данных, которая содержит какие -либо важные данные.
В качестве альтернативы, также можно использовать Mariastan без доступа к базе данных во время анализа. В этом случае вам нужно сначала сбросить схему, используя MariaDbFileDbReflection::dumpSchema и сохранить ее в файл. Вот пример сценария, который делает это:
<?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 ' )); Затем добавьте следующее в свой phpstan.neon :
parameters :
maria-stan :
reflection :
file : %rootDir%/../../../maria-stan-schema.dump
services :
mariaDbReflection : @ mariaDbFileDbReflectionОбратите внимание, что автоматическое расширение относительных путей работает только с собственной конфигурацией PHPSTAN (то есть это жесткий список ключей конфигурации). Таким образом, вам придется предоставить абсолютный путь к файлу дампа.
См. extension.neon для полного списка параметров.
Mariastan включает в себя образец расширения Phpstan для Mysqli. Однако цель этого расширения состоит в том, чтобы просто проверить интеграцию с PHPSTAN. Я не ожидаю, что кто -то на самом деле будет использовать MySQLI напрямую. Поэтому вы должны написать свое собственное расширение Phpstan, которое интегрируется с Mariastan. Если вы хотите использовать расширение Mysqli, включите ./vendor/schlndh/maria-stan/extension.mysqli.neon в вашем phpstan.neon .
Вы можете использовать расширение MySQLI в качестве отправной точки. Измените его, чтобы соответствовать вашим потребностям. Основная идея состоит в том, чтобы получить строку запроса от Phpstan, передать ее в Мариастен для анализа, а затем сообщить типы результатов и ошибки обратно в Phpstan.
Прежде чем вы начнете реализовать свое собственное расширение для интеграции Mariastan в свой проект, вы можете быстро попробовать его. Вы можете начать с проверки простого примера, который использует расширение MySQLI. Затем вы можете попытаться вызвать запросы из своей кодовой базы через MySQLI и проанализировать их с помощью расширения MySQLI, чтобы убедиться, что Mariastan поддерживает функции, которые используют ваши проекты.
Вот список функций, которые вы могли бы внедрить в свое собственное расширение PHPSTAN на основе Mariastan (большинство из них должны быть продемонстрированы в расширении MySQLI):
mysqli_result::fetch_fields ). Это связано с тем, что Mariastan может (в простых случаях) понимать запросы, такие как SELECT col FROM tbl WHERE col IS NOT NULL , и удалить NULL из типа результата, тогда как MariaDB, похоже, этого не делает.INSERT / REPLACESELECT COUNT(*) FROM tbl ), которые можно использовать для сужения типа возврата таких методов, как mysqli_result::fetch_all (то есть non-empty-array ). function foo ( mysqli $ db , int $ count ) {
return $ db -> prepare ( " SELECT * FROM tbl WHERE id IN ( " . implode ( ' , ' , array_fill ( 0 , $ count , ' ? ' )) . ' ) ' );
}Насколько я могу судить, PHPStan-DBA работает, выполняя запросы, чтобы получить информацию о типах результатов, ошибках, ... Mariastan, с другой стороны, статически анализирует запросы. Преимущества PHPStan-DBA включают:
Есть некоторые незначительные недостатки в подходе Phpstan-DBA:
information_schema , не обязательно во время анализа). Но можно реализовать CREATE TABLE (и т. Д.), А также реализовать отражение БД в верхней части этого.SELECT запросы в нескольких местах, а также использование транзакций. Поэтому я не уверен, насколько хорошо он поддерживает INSERT и т. Д. (По крайней мере, есть некоторые тесты).