/ Database Config

Database Config

Miko Framework provides a powerful configuration system for managing your application settings centrally.


Config Methods Summary

Method Description Example
load($path)Load config filesConfig::load('/path/to/config')
get($key, $default)Read value (dot notation)Config::get('database.host')
set($key, $value)Write valueConfig::set('app.debug', true)
has($key)Check if value existsConfig::has('database.mysql')
all()Get all configurationConfig::all()
env($key, $default)Read from .envConfig::env('DB_HOST', 'localhost')

DbConfig - Fluent Database Configuration

use Miko\Database\DbConfig;

$connection = DbConfig::mysql(
    'localhost',
    'myapp',
    'root',
    'secret',
    3306
)->charset('utf8mb4')->connect();

// SQLite / SQL Server / PostgreSQL
// DbConfig::sqlite('/path/to/db.sqlite')->connect();
// DbConfig::sqlServer('localhost', 'myapp', 'user', 'pass')->connect();
// DbConfig::postgreSql('localhost', 'myapp', 'user', 'pass')->connect();
// DbConfig::fromEnv()->connect();

There is no DbConfig::create()->driver()->host()->build() chain. Factories return a config object; connect() returns Miko\Database\Connection.


Connection pool (named connections)

Config/Database.php includes pool and session keys. With pool.enabled true, Miko\Core\Database\DatabaseConfig::createConnection() uses DatabaseManager + Miko\Database\ConnectionPool\ConnectionPool.

use Miko\Core\Config;
use Miko\Database\DatabaseManager;
use Miko\Database\ORM\Model;

Config::load(__DIR__ . '/Config');

$manager = DatabaseManager::fromConfig();
Model::setDatabase($manager);

$conn = $manager->connection();       // default
$other = $manager->connection('pgsql');

get() keys: database.default, database.connections.mysql, database.pool.enabled (Config also aliases Database.php as database).


Environment Variables (.env)

Example .env File

# Database Configuration
DB_DRIVER=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=my_database
DB_USERNAME=root
DB_PASSWORD=

# JWT Configuration
JWT_SECRET=your_jwt_secret_key_here
JWT_EXPIRE=3600

# Encryption
ENCRYPTION_KEY=your_encryption_key_here

# Logging
LOG_MAX_SIZE_MB=3
QUERY_SLOW_THRESHOLD=500

Reading Environment Values

use Miko\Core\Config;

// Database configuration
$host = Config::env('DB_HOST', 'localhost');
$port = Config::env('DB_PORT', 3306);
$database = Config::env('DB_DATABASE', 'my_database');

// JWT configuration
$jwtSecret = Config::env('JWT_SECRET');
$jwtExpire = Config::env('JWT_EXPIRE', 3600);

Config Files

Config/database.php

<?php
use Miko\Core\Config;

return [
    'default' => Config::env('DB_DRIVER', 'mysql'),
    
    'connections' => [
        'mysql' => [
            'driver' => 'mysql',
            'host' => Config::env('DB_HOST', '127.0.0.1'),
            'port' => Config::env('DB_PORT', 3306),
            'database' => Config::env('DB_DATABASE', 'miko'),
            'username' => Config::env('DB_USERNAME', 'root'),
            'password' => Config::env('DB_PASSWORD', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
        ],
        
        'pgsql' => [
            'driver' => 'pgsql',
            'host' => Config::env('DB_HOST', '127.0.0.1'),
            'port' => Config::env('DB_PORT', 5432),
            'database' => Config::env('DB_DATABASE', 'miko'),
            'username' => Config::env('DB_USERNAME', 'postgres'),
            'password' => Config::env('DB_PASSWORD', ''),
        ],
        
        'sqlite' => [
            'driver' => 'sqlite',
            'database' => Config::env('DB_DATABASE', 'database.sqlite'),
        ],
    ],
    
    'pool' => [
        'min' => 2,
        'max' => 10,
        'idle_timeout' => 60,
    ],
];

Using with DbContext

use Miko\Database\ORM\DbContext;
use Miko\Core\Config;

class AppDbContext extends DbContext
{
    protected function getConfig(): array
    {
        return [
            'host' => Config::env('DB_HOST_LOCAL', 'localhost'),
            'port' => (int) Config::env('DB_PORT', 3306),
            'database' => Config::env('DB_DATABASE_LOCAL', 'myapp'),
            'username' => Config::env('DB_USERNAME_LOCAL', 'root'),
            'password' => Config::env('DB_PASSWORD_LOCAL', ''),
            'charset' => 'utf8mb4'
        ];
    }
}

Best Practices

Rule Description
Don't commit .envAdd to .gitignore, use .env.example
Use defaultsConfig::get('key', 'default') for safe reading
Keep secrets in .envPasswords, API keys should be in .env
Modular config filesSeparate app.php, database.php, cache.php