Konfigurasi Module
Konfigurasi module disimpan di folder utama module itu sendiri, yaitu
./modules/[name]/config.php
. Bentuk umum konfigurasi suatu module adalah
sebagai berikut:
// ./modules/cmod/config.php
return [
'__name' => 'cmod',
'__version' => '0.0.1',
'__git' => 'https://github.com/getmim/cmod.git',
'__license' => 'MIT',
'__author' => [
'name' => 'Author',
'email' => 'author@email.com',
'website' => 'author.website.com'
],
'__files' => [
'modules/cmod' => ['install', 'update', 'remove'],
'app/cmod' => ['install', 'remove'],
'etc/log/cmod' => ['remove'],
'modules/cmod/Cmod.php' => ['opsolete']
],
'__dependencies' => [
'required' => [
[
'mod0' => 'https://github.com/getmim/mod0.git'
],
[
'mod1' => 'https://github.com/getmim/mod1.git',
'mod2' => 'https://github.com/getmim/mod2.git'
]
],
'optional' => [
[
'mod3' => 'https://github.com/getmim/mod3.git'
],
[
'mod4' => 'https://github.com/getmim/mod4.git',
'mod5' => 'https://github.com/getmim/mod5.git'
]
],
'composer' => [
'google/apiclient' => '^2.0'
]
],
'__inject' => [
[
'name' => 'name',
'question' => 'Application name',
'rule' => '!^.+$!'
],
[
'name' => 'version',
'question' => 'Application version',
'default' => '0.0.1',
'rule' => '!^[0-9]+\.[0-9]+\.[0-9]+$!'
],
[
'name' => 'host',
'question' => 'Application hostname ( without scheme )',
'rule' => '!^[a-z0-9-\.]+$!'
],
[
'name' => 'timezone',
'question' => 'Application timezone',
'default' => 'Asia/Jakarta',
'rule' => '!^.+$!'
],
[
'name' => 'install',
'question' => 'Application installation time',
'default' => [
'class' => 'Mim\\Provider\\Cli',
'method' => 'dInstall'
],
'rule' => '!^.+$!'
],
[
'name' => 'secure',
'question' => 'HTTP scheme',
'default' => 1,
'options' => [
1 => 'https',
2 => 'http'
]
],
[
'name' => '__gitignore',
'question' => 'Would you like to keep the modules dir in repository',
'default' => false,
'rule' => 'boolean',
'injector' => [
'class' => 'Mim\\Provider\\Cli',
'method' => 'iGitIgnore'
]
],
[
'name' => 'gates',
'children' => [
[
'name' => [
'question' => 'Add new gate. Gate name',
'rule' => '!^[a-z0-9-]*$!'
],
'children' => [
[
'name' => 'host',
'question' => 'New gate host name',
'default' => 'HOST',
'rule' => '!^.+$!'
],
[
'name' => 'path',
'question' => 'New gate path name',
'default' => '/',
'rule' => '!^.+$!'
]
]
]
]
],
[
'name' => 'logs',
'children' => [
[
'name' => 'access',
'question' => 'Log all access',
'rule' => 'boolean'
],
[
'name' => 'curl',
'question' => 'Log all curl actions',
'rule' => 'boolean'
],
[
'name' => 'error',
'question' => 'Log all error',
'rule' => 'boolean'
]
]
]
],
'__gitignore' => [
'etc/log/cmod' => true
],
'autoload' => [
'classes' => [
'Cmod\\Controller\\MainController' => [
'type' => 'file',
'base' => 'modules/cmod/controller/MainController.php'
],
'Cmod\\Library' => [
'type' => 'psr0',
'base' => 'modules/cmod/library'
],
'Cmod\\ThirdParty' => [
'type' => 'psr4',
'base' => 'modules/cmod/third-party/ThirdParty'
],
'Cmod\\Service' => [
'type' => 'file',
'base' => 'modules/cmod/system/Service.php',
'children' => 'modules/cmod/service'
],
'-dont-use-namespace-' => [
'type' => 'psr0',
'base' => 'modules/cmod/third-party/Google',
'prefix' => 'Google'
]
],
'files' => [
'modules/cmod/helper/global.php' => true
]
],
'gates' => [
'site' => [
'host' => [
'value' => 'HOST'
],
'path' => [
'value' => '/'
]
]
],
'routes' => [
'site' => [
'siteCmod' => [
'path' => [
'value' => '/cmod'
],
'handler' => 'Cmod\\Controller\\Main::index'
]
]
],
'service' => [
'cmod' => 'Cmod\\Service\\CmodPublic',
'cmod_p' => 'Cmod\\Service\\CmodPrivate'
],
'server' => [
// format
$module => [
$label => $Class::$method
],
// contoh
'cmod' => [
'PHP >= 7.2' => 'Cmod\\Server\\PHP::version'
]
],
'callback' => [
'/module/' => [
'/event/' => [
'Class::method' => true
]
]
]
];
Semua properti konfigurasi yang diawali denga dua underscore (__
) tidak akan
diikutkan dalam penggabungan dengan konfigurasi aplikasi, dan tidak bisa diakses
melalui service config.
Keterangan nilai dari masing-masing konfigurasi adalah sebagai berikut:
__name
Adalah nama module, nama module hanya boleh menggunakan karakter a-z
, 0-9
, -_.
.
Nama folder module harus sama persis dengan nama module.
__version
Properti ini menyimpan versi module dengan format NN.NN.NN
. Tidak adak spesifikasi
khusus untuk pengaturan bagaimana suatu versi dinaikan. Semuanya diserahkan kepada
developer.
__git
Properti ini menyimpan alamat repository di mana module ini disimpan.
__license
Adalah lisensi module ini.
__author
Properti ini berisi informasi developer yang membuat module ini. Properti ini
berisi tiga properti yaitu name
, email
, dan website
.
__files
Berisi daftar file module dan rule-rule nya pada saat instalasi. Properti ini
menyimpan nilai array key-value pair di mana key
adalah nama file atau folder,
sementara value
adalah array rule yang adalah gabungan install
, update
,
remove
, dan obsolete
.
install
File/folder akan dimasukan ke aplikasi pada saat instalasi, tapi tidak menindih jika file sudah ada.update
File/folder akan dimasukan ke aplikasi pada saat update module, dan akan menindih jika file sudah ada.remove
File/folder akan dihapus dari aplikasi pada saat module dihapus.opsolete
File/folder akan dihapus dari aplikasi pada saat update module.
__dependencies
Berisi daftar module yang dibutuhkan, atau pendukung yang mungkin akan ditanyakan
untuk diinstal berbarengan dengan instalasi suatu module. Semua module yang didaftarkan
di properti required
akan selalu diinstal, sementara daftar module yang ada
di bawah properti optinal
akan ditanyakan kepada user sebelum diinstal.
Pada suatu kondisi, mungkin ada kebutuhan harus menginstal salah satu dari beberapa
module yang ada, maka masing-masing module di tambahkan pada array seperti contoh
module mod1
dan mod2
di atas. Contoh seperti ini mungkin ada ketika menginstal
driver cache di mana driver harus diinstal, tapi boleh menggunakan driver apa saja,
seperti driver file atau driver redis, dan lain-lain.
Properti composer
adalah module composer yang perlu di install menggunakan
composer
, pastikan composer
terpasang di sistem. Semua module pada properti
ini akan selalu di instal.
__inject
Adalah daftar konfigurasi yang akan diinjek ke konfigurasi aplikasi pada saat
instalasi. Ketika memasang module dengan perintah cli app install /module/
,
daftar konfigurasi ini akan ditanyakan ke user untuk dituliskan ke konfigurasi
aplikasi.
Properti akhir juga menerima properti default
yang akan dijadikan nilai standar
jika user tidak mengisi data. Nilai dari properti ini juga bisa array class/method
yang akan dipanggil oleh cli untuk menentukan nilai default.
Jika nilai yang diberikan user masih perlu di proses, maka bisa menambahkan opsi
injector
yang berisi class dan method yang akan di panggil dengan parameter
pertama nilai konfigurasi aplikasi, dan parameter kedua adalah nilai yang diinput
user dari pertanyaan ini.
Nilai yang diterima properti rule
adalah seperti berikut di bawah:
boolean
any
number
regex
array
Jika menggunakan array class/method, maka nilai yang dikembalikan oleh fungsi diharapkan dalam format array sebagai berikut:
return [
'value' => "New value to use",
'error' => 'Error description'
];
Dimana nilai dari value
adalah nilai yang akan digunakan di config, dan nilai
dari error adalah string deskripsi error jika tidak valid, atau false
jika valid.
__gitignore
Daftar konten yang akan ditambahkan ke file .gitignore
aplikasi. Masing-masing
module mungkin memiliki file-file aplikasi yang tidak perlu diikutkan ke repository.
Pada konfigurasi ini didaftarkan semua rule-rule .gitignore
. Konfigurasi ini
tidak bisa diakses dari service config.
autoload
Properti ini berisi daftar autoload file atau class. Semua daftar file yang ada
di properti files
akan diload pada saat aplikasi dijalankan jika nilai konfigurasi
tersebut adalah true
. Sementara konten yang ada di properti classes
diload
hanya jika dibutuhkan.
Dukungan autoload untuk saat ini adalah file
, psr0
dan psr4
.
Jika target base adalah folder, maka nama class yang didefinisikan di konfigurasi dianggap sebagai prefix namespace.
Jika target adalah file, dan memiliki properti children
, maka semua file di dalam
folder children
akan dianggap menggunakan parent namespace yang didaftarkan di sini.
Jika namespace prefix di awali dan diakhiri dengan -
, maka namespace tersebut tidak
diikutkan pada class namespace.
Untuk psr0
, properti prefix
bisa digunakan untuk prefix class name.
Untuk tipe file
atau psr4
, nilai base
dan children
boleh menggunakan array jika
class tersimpan di tempat yang berbeda, seperti app/[module]/controller
dan modules/[module]/controller
.
gates
Sebuah module diperbolehkan membuat gate sendiri, atau menggunakan gate yang sudah disediakan oleh aplikasi. Konfigurasi ini berisi informasi gate yang didaftarkan oleh module. Silahkan mengacu pada gate untuk informasil lebih lanjut tentang konfigurasi ini.
routes
Adalah daftar routes yang dilayani module ini. Silahkan mengacu pada route untuk informasi lebih lanjut tentang konfigurasi ini.
service
Adalah daftar service yang disediakan oleh module. Silahkan mengacu pada service untuk informasi lebih lanjut tentang konfigurasi ini.
server
Konfigurasi ini meyimpan daftar test server yang akan digunakan oleh cli untuk menentukan apakah instalasi server sudah bisa digunakan untuk menjalankan aplikasi. Sebaiknya masing-masing module menyimpan test server di sub konfigurasi dengan nama modulenya masing-masing.
Properti $label
akan ditampilkan ke user, dan $Class::$method
adalah class
handler yang akan dipanggil untuk menentukan apakah server sudah sesuai atau belum.
Nilai $Class::$method
akan dipanggil secara static. Nilai yang dikembalikan oleh
pemanggilan fungsi tersebut harus array dengan dua key, yaitu success
yang berisi
boolean true
jika berhasil, atau false
jika gagal. Key yang kedua adalah info
yang berisi informasi hasil test, nilai ini boleh empty string.
// ./modules/cmod/server/PHP.php
namespace Cmod\Server;
class PHP {
static function version(){
return [
'success' => version_compare(PHP_VERSION, '7.2', '>='),
'info' => PHP_VERSION
];
}
}
callback
Adalah bagian yang menyimpan informasi callback yang akan dipanggil ketika suatu event terjadi pada aplikasi. Beberapa module/event yang sudah ada adalah:
app
reconfig
Callback yang akan dipanggil ketika aplikasi sedang membuat ulang konfigurasi aplikasi dengan perintahmim app config
.
core
ready
Dipanggil ketika system sudah siap dijalankan, tapi belum masuk ke routerprinting
Dipanggil ketika system sudah selesai menggenerasi view, dan siap mengirimkan response kembali ke user. Jika salah satu callback disini mengembalikan nilaifalse
, maka system akan membatalkan pengiriman konten ke client.
Class handler akan di panggil dengan perintah:
$Class::$method($configs, $here);
Dimana $configs
adalah semua konfig yang sudah terkumpul, dan $here
adalah folder aplikasi
dimana proses konfig ini berjalan.
Di bawah ini adalah contoh reconfig yang benar:
class Class{
static function reconfig(object &$configs, string $here) {
$configs->lorem = 'ipsum';
}
}