Mariastan adalah alat analisis statis untuk pertanyaan Mariadb. Tujuan utamanya adalah untuk berfungsi sebagai dasar untuk ekstensi phpstan.
Status Saat Ini (24. 04. 2024):
Mariastan sangat tidak lengkap. Ini mencakup mungkin ~ 90% kasus penggunaan dalam basis kode besar di mana saya menggunakannya (ratusan tabel, ribuan kueri). Akibatnya tidak ada banyak aktivitas. Tetapi secara aktif dipertahankan dalam arti bahwa jika sesuatu rusak bagi saya, itu mungkin akan diperbaiki.
Jika Anda mencoba menggunakannya di proyek Anda, Anda cenderung mengalami kasus penggunaan yang tidak diimplementasikan (misalnya sintaks/fungsi yang tidak digunakan proyek saya). Jika itu terjadi, Anda harus siap untuk memperbaiki sesuatu untuk diri sendiri (kebanyakan hal harus mudah).
Tidak ada janji kompatibilitas ke belakang pada apa pun, dan tidak ada rilis - saya hanya menggunakan master.
Mariastan diuji dengan MariaDB 10.11 dan PHP 8.1-8.3.
Instal mariastan menggunakan composer require --dev schlndh/maria-stan:dev-master . Maka Anda harus menambahkan yang berikut ini ke phpstan.neon Anda.
includes :
- ./vendor/schlndh/maria-stan/extension.neon
Mariastan membutuhkan akses ke skema basis data. Cara termudah untuk menyediakannya adalah dengan membiarkannya terhubung langsung ke database. Anda harus menambahkan konfigurasi berikut ke phpstan.neon Anda dan menetapkan kredensial yang tepat:
parameters :
maria-stan :
db :
# Change these to match your database
host : 127.0.0.1
port : 3306
user : ' root '
password : ' '
database : ' db 'Mariastan membutuhkan akses ke database untuk mengambil skema untuk analisis kueri. Itu hanya membaca skema tabel dan tidak menulis apa pun. Namun demikian, jangan berikan akses ke database apa pun yang berisi data penting apa pun.
Atau, dimungkinkan juga untuk menggunakan Mariastan tanpa akses ke database selama analisis. Dalam hal ini Anda harus terlebih dahulu membuang skema menggunakan MariaDbFileDbReflection::dumpSchema dan menyimpannya ke dalam file. Berikut adalah contoh skrip yang melakukan itu:
<?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 ' )); Kemudian tambahkan yang berikut ini ke phpstan.neon Anda.
parameters :
maria-stan :
reflection :
file : %rootDir%/../../../maria-stan-schema.dump
services :
mariaDbReflection : @ mariaDbFileDbReflectionPerhatikan bahwa ekspansi otomatis jalur relatif hanya berfungsi dengan konfigurasi PhPstan sendiri (yaitu ini adalah daftar kunci konfigurasi yang hardcoded). Jadi Anda harus memberikan jalur absolut ke file dump.
Lihat extension.neon untuk daftar lengkap parameter.
Mariastan termasuk sampel ekstensi phpstan untuk mysqli. Namun, tujuan ekstensi ini hanya untuk memverifikasi integrasi dengan phpstan. Saya tidak berharap siapa pun benar -benar menggunakan mysqli secara langsung. Karena itu, Anda diharapkan untuk menulis ekstensi phpstan Anda sendiri yang terintegrasi dengan Mariastan. Jika Anda ingin menggunakan ekstensi mysqli termasuk ./vendor/schlndh/maria-stan/extension.mysqli.neon di phpstan.neon Anda.
Anda dapat menggunakan ekstensi MySQLI sebagai titik awal A memodifikasinya agar sesuai dengan kebutuhan Anda. Ide dasarnya adalah untuk mendapatkan string kueri dari Phpstan, berikan ke Mariastan untuk dianalisis dan kemudian melaporkan jenis hasil dan kesalahan kembali ke Phpstan.
Sebelum Anda mulai menerapkan ekstensi Anda sendiri untuk mengintegrasikan Mariastan ke dalam proyek Anda, Anda dapat dengan cepat mencobanya. Anda dapat mulai dengan memeriksa contoh sederhana yang menggunakan ekstensi MySQLI. Kemudian Anda dapat mencoba memanggil kueri dari basis kode Anda melalui MySQLI dan menganalisisnya dengan ekstensi MySQLI untuk memastikan bahwa Mariastan mendukung fitur yang digunakan proyek Anda.
Berikut adalah daftar fitur yang dapat Anda terapkan ke dalam ekstensi phpstan Anda sendiri berdasarkan Mariastan (kebanyakan dari mereka harus ditunjukkan dalam ekstensi MySQLI):
mysqli_result::fetch_fields ). Ini karena Mariastan dapat (dalam kasus sederhana) memahami pertanyaan seperti SELECT col FROM tbl WHERE col IS NOT NULL dan menghapus NULL dari jenis hasil, sedangkan Mariadb tampaknya tidak melakukan itu.INSERT / REPLACESELECT COUNT(*) FROM tbl ) yang dapat digunakan untuk mempersempit jenis metode pengembalian seperti mysqli_result::fetch_all (yaitu non-empty-array ). function foo ( mysqli $ db , int $ count ) {
return $ db -> prepare ( " SELECT * FROM tbl WHERE id IN ( " . implode ( ' , ' , array_fill ( 0 , $ count , ' ? ' )) . ' ) ' );
}Sejauh yang saya tahu, Phpstan-DBA bekerja dengan melaksanakan pertanyaan untuk mendapatkan informasi tentang jenis hasil, kesalahan, ... Mariastan di sisi lain menganalisis pertanyaan secara statis. Manfaat Phpstan-DBA meliputi:
Ada beberapa kelemahan kecil untuk pendekatan Phpstan-DBA:
information_schema , tidak harus pada waktu analisis). Tetapi dimungkinkan untuk mengimplementasikan CREATE TABLE (dll.) Menguras dan mengimplementasikan refleksi DB di atas itu.SELECT kueri di beberapa tempat, serta penggunaan transaksi. Oleh karena itu, saya tidak yakin seberapa baik mendukung INSERT dll. (Setidaknya ada beberapa tes).