Mariastanは、Mariadbクエリの静的分析ツールです。その主な目的は、PHPSTAN拡張機能の基礎として機能することです。
現在のステータス(24。04。2024):
マリアスタンは非常に不完全です。おそらく、私が使用している大きなコードベース(何百ものテーブル、数千のクエリ)のユースケースの約90%をカバーします。その結果、あまり活動はありません。しかし、何かが私のために壊れた場合、それはおそらく修正されるという意味で積極的に維持されています。
プロジェクトで使用しようとすると、実装されていないユースケースに遭遇する可能性があります(プロジェクトが使用していない構文/関数など)。それが起こった場合、あなたは自分のために物事を修正する準備をする必要があります(ほとんどのことは簡単なはずです)。
何にも逆適合性の約束はありません。リリースはありません - 私はマスターを使用しています。
MariastanはMariadb 10.11およびPhp 8.1-8.3でテストされています。
Mariastanを使用して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には、mysqli用のサンプルphpstan拡張機能が含まれています。ただし、この拡張機能の目的は、単にPHPSTANとの統合を検証することです。私は誰も実際にmysqliを直接使用することを期待していません。したがって、マリアスタンと統合する独自のPHPSTAN拡張機能を書くことが期待されています。 mysqli拡張子を使用する場合は、 phpstan.neonにある./vendor/schlndh/maria-stan/extension.mysqli.neonを含みます。
MySQLI拡張機能を出発点として使用できます。ニーズに合わせて変更します。基本的なアイデアは、phpstanからクエリ文字列を取得し、分析のためにマリアスタンに渡してから、結果の種類とエラーをphpstanに報告することです。
マリアスタンをプロジェクトに統合するための独自の拡張機能の実装を開始する前に、すぐに試してみることができます。 MySQLI拡張機能を使用する簡単な例をチェックすることから始めることができます。次に、MySQLI経由でコードベースからクエリを呼び出し、MySQLI拡張機能で分析して、MariaStanがプロジェクトが使用する機能をサポートすることを確認できます。
Mariastanに基づいて独自のPHPSTAN拡張機能に実装できる機能のリストを次に示します(それらのほとんどはMySQLI拡張機能で実証する必要があります):
mysqli_result::fetch_fieldsなど)。これは、Mariastanが(単純な場合) SELECT col FROM tbl WHERE col IS NOT NULL 、結果タイプからNULLを除去できるためですが、Mariadbはそうしていないようです。INSERT / REPLACEの必須列のデータがありませんmysqli_result::fetch_all (ie non-empty-array )のようなメソッドのリターンタイプを絞り込むために使用できる返された行の数( SELECT COUNT(*) FROM tblなど)を決定できます。 function foo ( mysqli $ db , int $ count ) {
return $ db -> prepare ( " SELECT * FROM tbl WHERE id IN ( " . implode ( ' , ' , array_fill ( 0 , $ count , ' ? ' )) . ' ) ' );
}私が知る限り、PHPSTAN-DBAはクエリを実行して結果タイプ、エラー、...マリアスタンに関する情報を取得することで機能します。一方、クエリを静的に分析します。 phpstan-dbaの利点は次のとおりです。
phpstan-dbaのアプローチにはマイナーな欠点がいくつかあります。
information_schemaからデータを取得します)。ただし、 CREATE TABLE (など)の解析を実装し、その上にDB反射を実装することができます。SELECTように制限する条件と、トランザクションの使用を見ました。したがって、 INSERTなどをどれだけうまくサポートしているかはわかりません(少なくともテストにはいくつかあります)。