Skip to content

Configuration

Laravel Nusa is designed to work out of the box with sensible defaults, but it provides several configuration options to customize its behavior according to your application's needs.

Publishing Configuration

To customize Laravel Nusa's configuration, first publish the config file:

bash
php artisan vendor:publish --tag=creasi-nusa-config

This creates config/creasi/nusa.php with all available configuration options.

Configuration Options

Database Connection

php
'connection' => env('CREASI_NUSA_CONNECTION', 'nusa'),

Default: nusa

Specifies the database connection name for Laravel Nusa data. The package automatically configures a SQLite connection, but you can customize it.

Custom Database Connection

To use a different database connection, add it to config/database.php:

php
'connections' => [
    // Your existing connections...
    
    'indonesia' => [
        'driver' => 'sqlite',
        'database' => database_path('indonesia.sqlite'),
        'prefix' => '',
        'foreign_key_constraints' => true,
    ],
    
    // Or use MySQL/PostgreSQL
    'indonesia_mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => 'indonesia_data',
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
    ],
],

Then update your environment:

dotenv
CREASI_NUSA_CONNECTION=indonesia

Table Names

php
'table_names' => [
    'provinces' => 'provinces',
    'regencies' => 'regencies',
    'districts' => 'districts',
    'villages' => 'villages',
],

Customize table names if you need different naming conventions:

php
'table_names' => [
    'provinces' => 'provinsi',
    'regencies' => 'kabupaten_kota',
    'districts' => 'kecamatan',
    'villages' => 'kelurahan_desa',
],

Address Model

php
'addressable' => \Creasi\Nusa\Models\Address::class,

Specify which model to use for address management. You can create your own implementation:

php
// Create your custom address model
class CustomAddress extends \Creasi\Nusa\Models\Address
{
    protected $fillable = [
        'user_id',
        'name',
        'phone',
        'province_code',
        'regency_code',
        'district_code',
        'village_code',
        'address_line',
        'postal_code',
        'is_default',
        'notes'
    ];
    
    protected $casts = [
        'is_default' => 'boolean',
    ];
}

// Update configuration
'addressable' => \App\Models\CustomAddress::class,

API Routes

php
'routes_enable' => env('CREASI_NUSA_ROUTES_ENABLE', true),
'routes_prefix' => env('CREASI_NUSA_ROUTES_PREFIX', 'nusa'),

Control API route registration and customize the route prefix.

Environment Variables

Add these variables to your .env file for easy configuration:

dotenv
# Database connection
CREASI_NUSA_CONNECTION=nusa

# API routes
CREASI_NUSA_ROUTES_ENABLE=true
CREASI_NUSA_ROUTES_PREFIX=nusa

# Custom database settings (if using custom connection)
INDONESIA_DB_HOST=127.0.0.1
INDONESIA_DB_DATABASE=indonesia_data
INDONESIA_DB_USERNAME=indonesia_user
INDONESIA_DB_PASSWORD=secret_password

Advanced Configuration

Custom Service Provider

For advanced customization, you can create your own service provider:

php
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Creasi\Nusa\Contracts;
use App\Models\CustomAddress;

class NusaServiceProvider extends ServiceProvider
{
    public function register()
    {
        // Override default address model
        $this->app->bind(Contracts\Address::class, CustomAddress::class);
        
        // Add custom database connection
        config([
            'database.connections.indonesia' => [
                'driver' => 'mysql',
                'host' => env('INDONESIA_DB_HOST', '127.0.0.1'),
                'database' => env('INDONESIA_DB_DATABASE', 'indonesia'),
                'username' => env('INDONESIA_DB_USERNAME', 'root'),
                'password' => env('INDONESIA_DB_PASSWORD', ''),
                'charset' => 'utf8mb4',
                'collation' => 'utf8mb4_unicode_ci',
            ]
        ]);
    }
    
    public function boot()
    {
        // Custom route registration
        if (config('app.env') === 'production') {
            // Disable routes in production
            config(['creasi.nusa.routes_enable' => false]);
        }
    }
}

Register your service provider in config/app.php:

php
'providers' => [
    // Other providers...
    App\Providers\NusaServiceProvider::class,
],

Middleware Configuration

Apply middleware to API routes:

php
// In your RouteServiceProvider or custom service provider
use Illuminate\Support\Facades\Route;

Route::middleware(['api', 'throttle:60,1'])
    ->prefix('api/indonesia')
    ->name('indonesia.')
    ->group(base_path('vendor/creasi/laravel-nusa/routes/nusa.php'));

Custom Route Registration

Disable default routes and register your own:

dotenv
CREASI_NUSA_ROUTES_ENABLE=false
php
// routes/api.php
use Creasi\Nusa\Http\Controllers\{ProvinceController, RegencyController};

Route::middleware(['auth:api', 'throttle:100,1'])->prefix('v1/indonesia')->group(function () {
    Route::get('provinces', [ProvinceController::class, 'index']);
    Route::get('provinces/{province}', [ProvinceController::class, 'show']);
    Route::get('provinces/{province}/regencies', [ProvinceController::class, 'regencies']);
    
    Route::get('regencies', [RegencyController::class, 'index']);
    Route::get('regencies/{regency}', [RegencyController::class, 'show']);
    // Add more routes as needed
});

Performance Configuration

Database Optimization

For high-traffic applications, consider these optimizations:

php
// config/database.php - SQLite optimizations
'nusa' => [
    'driver' => 'sqlite',
    'database' => env('NUSA_DATABASE_PATH', database_path('nusa.sqlite')),
    'prefix' => '',
    'foreign_key_constraints' => true,
    'options' => [
        PDO::ATTR_TIMEOUT => 30,
        PDO::ATTR_EMULATE_PREPARES => false,
    ],
],

// For MySQL/PostgreSQL
'nusa_mysql' => [
    'driver' => 'mysql',
    'options' => [
        PDO::ATTR_EMULATE_PREPARES => false,
        PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
    ],
    'strict' => true,
    'engine' => 'InnoDB',
],

Caching Configuration

Implement caching for frequently accessed data:

php
// config/cache.php
'stores' => [
    'nusa' => [
        'driver' => 'redis',
        'connection' => 'nusa',
        'prefix' => 'nusa_cache',
    ],
],

'connections' => [
    'nusa' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => 2, // Use different database for Nusa cache
    ],
],

Create a caching service:

php
namespace App\Services;

use Illuminate\Support\Facades\Cache;
use Creasi\Nusa\Models\{Province, Regency, District, Village};

class NusaCacheService
{
    protected $cacheStore = 'nusa';
    protected $ttl = 3600; // 1 hour
    
    public function getProvinces()
    {
        return Cache::store($this->cacheStore)->remember('provinces', $this->ttl, function () {
            return Province::orderBy('name')->get(['code', 'name']);
        });
    }
    
    public function getRegenciesByProvince(string $provinceCode)
    {
        $key = "regencies.{$provinceCode}";
        
        return Cache::store($this->cacheStore)->remember($key, $this->ttl, function () use ($provinceCode) {
            return Regency::where('province_code', $provinceCode)
                ->orderBy('name')
                ->get(['code', 'name']);
        });
    }
    
    public function clearCache()
    {
        Cache::store($this->cacheStore)->flush();
    }
}

Security Configuration

API Security

Protect API endpoints in production:

php
// routes/api.php
Route::middleware(['auth:sanctum', 'throttle:60,1'])->group(function () {
    Route::get('nusa/provinces', [ProvinceController::class, 'index']);
    // Other protected routes...
});

// Or use API keys
Route::middleware(['api.key', 'throttle:100,1'])->group(function () {
    // Protected routes
});

CORS Configuration

Configure CORS for frontend applications:

php
// config/cors.php
'paths' => ['api/*', 'nusa/*'],
'allowed_methods' => ['GET'],
'allowed_origins' => [
    'https://yourdomain.com',
    'https://app.yourdomain.com',
],
'allowed_headers' => ['*'],
'exposed_headers' => [],
'max_age' => 0,
'supports_credentials' => false,

Testing Configuration

For testing environments:

php
// config/nusa.php
'connection' => env('CREASI_NUSA_CONNECTION', 
    app()->environment('testing') ? 'nusa_testing' : 'nusa'
),

// config/database.php
'nusa_testing' => [
    'driver' => 'sqlite',
    'database' => ':memory:',
    'prefix' => '',
    'foreign_key_constraints' => true,
],

Configuration Validation

Create a command to validate your configuration:

php
namespace App\Console\Commands;

use Illuminate\Console\Command;
use Creasi\Nusa\Models\Province;

class ValidateNusaConfig extends Command
{
    protected $signature = 'nusa:validate-config';
    protected $description = 'Validate Laravel Nusa configuration';
    
    public function handle()
    {
        $this->info('Validating Laravel Nusa configuration...');
        
        // Test database connection
        try {
            $count = Province::count();
            $this->info("✓ Database connection working. Found {$count} provinces.");
        } catch (\Exception $e) {
            $this->error("✗ Database connection failed: {$e->getMessage()}");
            return 1;
        }
        
        // Test configuration values
        $connection = config('creasi.nusa.connection');
        $this->info("✓ Using connection: {$connection}");
        
        $routesEnabled = config('creasi.nusa.routes_enable');
        $this->info("✓ API routes " . ($routesEnabled ? 'enabled' : 'disabled'));
        
        $prefix = config('creasi.nusa.routes_prefix');
        $this->info("✓ Route prefix: {$prefix}");
        
        $this->info('Configuration validation completed successfully!');
        return 0;
    }
}

Troubleshooting Configuration

Common Issues

  1. Database Connection Errors

    bash
    # Check if SQLite file exists and is readable
    ls -la vendor/creasi/laravel-nusa/database/nusa.sqlite
    
    # Test connection
    php artisan tinker
    >>> \Creasi\Nusa\Models\Province::count()
  2. Route Conflicts

    bash
    # Check registered routes
    php artisan route:list | grep nusa
    
    # Clear route cache
    php artisan route:clear
  3. Configuration Cache Issues

    bash
    # Clear configuration cache
    php artisan config:clear
    
    # Rebuild cache
    php artisan config:cache

Debug Mode

Enable debug mode for troubleshooting:

php
// In your service provider or configuration
if (config('app.debug')) {
    // Enable query logging for Nusa connection
    DB::connection('nusa')->enableQueryLog();
    
    // Log all Nusa queries
    DB::connection('nusa')->listen(function ($query) {
        Log::debug('Nusa Query', [
            'sql' => $query->sql,
            'bindings' => $query->bindings,
            'time' => $query->time
        ]);
    });
}

This comprehensive configuration guide covers all aspects of customizing Laravel Nusa for your specific needs, from basic settings to advanced performance and security configurations.

Released under the MIT License.