Hệ Thống Extension

Hệ Thống Extension của Jankx cho phép bạn module hóa chức năng và tải tính năng động.

Tổng Quan

┌─────────────────────────────────────────┐
│         ExtensionManager                │
│  ┌─────────┐ ┌─────────┐ ┌─────────┐  │
│  │ Plugin  │ │ Theme   │ │ Custom  │  │
│  │ Ext A   │ │ Ext B   │ │ Ext C   │  │
│  └────┬────┘ └────┬────┘ └────┬────┘  │
│       └────────────┴────────────┘       │
│              Manifest                    │
└─────────────────────────────────────────┘

ExtensionManager

Trung tâm quản lý tất cả các extensions:

use Jankx\Extensions\ExtensionManager;

// Lấy singleton instance
$manager = ExtensionManager::getInstance();

// Kiểm tra extension đang active
if ($manager->is_extension_active('my-extension')) {
    // Extension đang active
}

// Lấy tất cả extensions
$extensions = $manager->get_extensions();

Extension Manager API

// Kích hoạt/Hủy kích hoạt
$manager->activate_extension('my-extension');
$manager->deactivate_extension('my-extension');

// Cài đặt/Gỡ cài đặt
$manager->install_extension('my-extension');
$manager->uninstall_extension('my-extension');

// Yêu cầu
$manager->require_extension('required-ext', true);   // Bắt buộc
$manager->require_extension('optional-ext', false);  // Khuyến nghị

// Kiểm tra
$manager->is_extension_active('my-extension');
$manager->is_extension_required('my-extension');
$manager->is_extension_installed('my-extension');

Tạo Extensions

Bước 1: Tạo Extension Class

<?php
namespace Jankx\Extensions\MyExtension;

use Jankx\Extensions\AbstractExtension;

class MyExtension extends AbstractExtension
{
    protected $id = 'my-extension';
    protected $name = 'My Extension';
    protected $version = '1.0.0';
    protected $author = 'Your Name';
    protected $description = 'Mô tả extension';
    
    public function activate(): void
    {
        parent::activate();
        
        // Logic kích hoạt
        $this->register_post_types();
        $this->register_taxonomies();
    }
    
    public function deactivate(): void
    {
        // Logic cleanup
        parent::deactivate();
    }
    
    public function boot(): void
    {
        // Chạy sau khi tất cả extensions được load
        add_action('init', [$this, 'init']);
    }
}

Bước 2: Tạo Manifest

{
    "name": "My Extension",
    "id": "my-extension",
    "version": "1.0.0",
    "author": "Your Name",
    "description": "Mô tả extension",
    "main": "MyExtension.php",
    "class": "Jankx\\Extensions\\MyExtension\\MyExtension",
    "requires": {
        "php": ">=7.4",
        "wordpress": ">=5.8",
        "jankx": ">=2.0"
    },
    "dependencies": [
        "other-extension"
    ]
}

Bước 3: Đăng Ký Extension

use Jankx\Extensions\ExtensionManager;
use Jankx\Extensions\MyExtension\MyExtension;

add_action('jankx/extensions/init', function(ExtensionManager $manager) {
    $manager->add_extension('my-extension', new MyExtension());
});

Extension Manifest

Trường Kiểu Mô Tả
namestringTên hiển thị
idstringID duy nhất
versionstringSemantic version
authorstringTên tác giả
descriptionstringMô tả
mainstringFile entry point
classstringTên class đầy đủ
requiresobjectYêu cầu (php, wordpress, jankx)
dependenciesarrayExtensions phụ thuộc

Vòng Đời Extension

class MyExtension extends AbstractExtension
{
    // Gọi khi cài đặt
    public function install(): bool
    {
        // Tạo tables, options, etc.
        return true;
    }
    
    // Gọi khi kích hoạt
    public function activate(): void
    {
        // Đăng ký hooks, flush rewrite rules
    }
    
    // Gọi sau khi tất cả extensions được load
    public function boot(): void
    {
        // Khởi tạo services
    }
    
    // Gọi trên WordPress init
    public function init(): void
    {
        // Đăng ký shortcodes, widgets
    }
    
    // Gọi khi hủy kích hoạt
    public function deactivate(): void
    {
        // Cleanup, flush cache
    }
    
    // Gọi khi gỡ cài đặt
    public function uninstall(): bool
    {
        // Xóa tables, options
        return true;
    }
}

Tính Năng Pro

License Management PRO

use Jankx\Facades\License;

// Kiểm tra license
if (License::is_valid()) {
    // License hợp lệ
}

// Kích hoạt license
License::activate('your-license-key');

// Lấy thông tin license
$info = License::get_info();

Auto-Updates PRO

// Bật auto-update cho extension cụ thể
add_filter('jankx/extension/auto_update', function($enabled, $extension) {
    if ($extension === 'my-premium-ext') {
        return true;
    }
    return $enabled;
}, 10, 2);

Các Nguyên Tắc Tốt

  1. Namespace Đúng Cách - Dùng Jankx\Extensions\MyExtension
  2. Dùng Dependency Injection - Tận dụng Application container
  3. Xử Lý Phụ Thuộc - Kiểm tra các extensions yêu cầu
  4. Quản Lý Version - Chạy migrations khi đổi version
  5. Xử Lý Lỗi - Dùng try-catch và Log facade

← Quay Lại Tài Liệu