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
| Field | Type | Description |
|---|---|---|
name | string | Unique plugin identifier (kebab-case) |
title | string | Human-readable plugin name (≤70 chars) |
description | string | Plugin purpose (≤160 chars) |
version | string | Plugin version (semver) |
author | string | Plugin author name |
license | string | License type (MIT, Apache-2.0, etc.) |
namespace | string | PHP namespace (PascalCase) |
providers | array | Service provider classes |
routes | object | Route file definitions |
config | string | Configuration file path |
permissions | array | Plugin-specific permissions |
settings | object | Default settings |
menus | array | Admin menu items |
assets | object | CSS 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
- Lifecycle Contract — Plugin lifecycle methods
- Hooks Reference — Available hooks
- Menus, Assets & Routes — UI integration
Still stuck?
Our support team is ready to help you get set up.

