Xgenious/ docs
Products
Get support

Plugin Scaffold

The plugin scaffold provides the foundational structure for all Fundorex plugins.

Directory Structure

my-plugin/
├── plugin.json
├── composer.json
├── composer.lock
├── config/
│   └── plugin.php
├── src/
│   ├── PluginContract.php
│   ├── Http/
│   │   └── Controllers/
│   ├── Events/
│   ├── Listeners/
│   └── Providers/
│       └── PluginServiceProvider.php
├── routes/
│   └── web.php
├── resources/
│   ├── views/
│   └── assets/
│       ├── css/
│       └── js/
├── database/
│   ├── migrations/
│   └── seeders/
├── tests/
│   └── Feature/
└── README.md

Plugin Manifest

The plugin.json file defines plugin metadata and configuration.

Manifest Structure

{
  "name": "my-plugin",
  "title": "My Plugin",
  "description": "A description of my plugin",
  "version": "1.0.0",
  "author": "Your Name",
  "license": "MIT",
  "namespace": "MyVendor\\MyPlugin",
  "providers": [
    "MyVendor\\MyPlugin\\Providers\\PluginServiceProvider"
  ],
  "routes": {
    "web": "routes/web.php"
  },
  "config": "config/plugin.php",
  "permissions": [],
  "settings": {},
  "menus": [],
  "assets": {
    "css": [],
    "js": []
  }
}

Manifest Fields

FieldTypeDescription
namestringUnique plugin identifier (kebab-case)
titlestringHuman-readable plugin name (≤70 chars)
descriptionstringPlugin purpose (≤160 chars)
versionstringPlugin version (semver)
authorstringPlugin author name
licensestringLicense type (MIT, Apache-2.0, etc.)
namespacestringPHP namespace (PascalCase)
providersarrayService provider classes
routesobjectRoute file definitions
configstringConfiguration file path
permissionsarrayPlugin-specific permissions
settingsobjectDefault settings
menusarrayAdmin menu items
assetsobjectCSS and JS file paths

Plugin Service Provider

Create a service provider to bootstrap your plugin.

<?php

namespace MyVendor\MyPlugin\Providers;

use Illuminate\Support\ServiceProvider;

class PluginServiceProvider extends ServiceProvider
{
    public function register()
    {
        // Register bindings, services, singletons
    }

    public function boot()
    {
        // Boot services, register routes, migrations, etc.
        $this->loadRoutesFrom(__DIR__ . '/../../routes/web.php');
        $this->loadMigrationsFrom(__DIR__ . '/../../database/migrations');
        $this->loadViewsFrom(__DIR__ . '/../../resources/views', 'my-plugin');
    }
}

Plugin Contract Interface

All plugins must implement PluginContract.

<?php

namespace MyVendor\MyPlugin;

use Fundorex\Plugin\PluginContract;

class Plugin implements PluginContract
{
    public function getName(): string
    {
        return 'my-plugin';
    }

    public function getVersion(): string
    {
        return '1.0.0';
    }

    public function install(): void
    {
        // Installation logic
    }

    public function uninstall(): void
    {
        // Uninstallation logic
    }

    public function enable(): void
    {
        // Activation logic
    }

    public function disable(): void
    {
        // Deactivation logic
    }
}

Getting Started

1. Create Plugin Directory

mkdir my-plugin
cd my-plugin

2. Initialize Composer

composer init

3. Create plugin.json

Copy the manifest structure above and customize for your plugin.

4. Create Directory Structure

mkdir -p src/{Http/Controllers,Events,Listeners,Providers}
mkdir -p routes resources/{views,assets/{css,js}}
mkdir -p database/{migrations,seeders} tests/Feature

5. Create Plugin Contract

Implement PluginContract in src/Plugin.php.

6. Create Service Provider

Create src/Providers/PluginServiceProvider.php to bootstrap your plugin.

7. Add Routes (Optional)

Create routes/web.php for plugin routes:

<?php

use Illuminate\Support\Facades\Route;

Route::prefix('my-plugin')->group(function () {
    Route::get('/', 'MyVendor\\MyPlugin\\Http\\Controllers\\DashboardController@index');
});

Next Steps

Still stuck?
Our support team is ready to help you get set up.
Get support