Documentation

Extension System

Extension architecture, lifecycle, manifest format, discovery flow, and templates

Last updated: Feb 09, 2026

Extension System

Extensions are database-backed plugins with a filesystem discovery mechanism. There are two sources:

SourcePathExample
Bundled (first-party)packages/Cartxis//extension.jsonPayment gateways
Filesystem (third-party)extensions//extension.jsonUser-installed

Extension Lifecycle

Discoverable → Installed → Active
     ↑              ↑          ↑
  Filesystem    extensions   ServiceProvider
  scanning     DB record     dynamically loaded

extension.json Manifest

{
    "code": "stripe",
    "name": "Stripe Payment Gateway",
    "version": "1.0.0",
    "description": "Accept payments via Stripe",
    "author": "Cartxis Team",
    "icon": "credit-card",
    "requires": [],
    "provider": "Cartxis\\Stripe\\Providers\\StripeServiceProvider",
    "provider_file": "src/Providers/StripeServiceProvider.php",
    "category": "payment-gateway"
}

Key Manifest Fields

FieldPurpose
codeUnique identifier — must match DB extension record
providerFully-qualified ServiceProvider class name
provider_fileFallback file path if autoloading isn't available
requiresArray of extension codes this extension depends on
categoryClassification (e.g., payment-gateway, shipping, analytics)

Extension Discovery Flow

  1. ExtensionService::discover() scans both extensions/ and packages/Cartxis/ for extension.json files.
  2. Validated manifests are matched against the extensions database table.
  3. During boot, CoreServiceProvider::bootExtensions() loads the ServiceProvider of every active extension.
  4. Bundled extensions use PSR-4 autoloading; filesystem extensions use require_once on provider_file.

An extension template is provided at extension/templates/payment-gateway/ with scaffold files for creating new payment gateway extensions.