EntityForge is a WIP open source configuration-driven, multi-tenant SaaS framework built in PHP.
It enables developers to build scalable SaaS applications with:
- JSON-based code generation
- Multi-tenant architecture (shared or database-per-tenant)
- Automated migrations and rollback
- Tenant provisioning and lifecycle management
Define your application using JSON:
{
"entity": "User",
"multiTenant": true,
"timestamps": true,
"fields": {
"name": "string",
"email": "string"
}
}Supports two strategies:
- Shared Database
- Database per Tenant
Generate:
- Entities
- Repositories
- Migrations
php bin/ef generate User
php bin/ef generate:all- Forward migrations
- Rollback support
- Batch tracking
php bin/ef migrate
php bin/ef migrate:rollbackAutomatically creates:
- Tenant database
- Schema (via migrations)
php bin/ef tenant:create tenant_1Central tenants table stores:
- tenant_id
- name
- status
This will be part of PHP Packagist and will replace the entity-forge ORM.
composer require vedavith/entity-forgetenancy:
enabled: true
strategy: shared
database:
driver: mysql
host: 127.0.0.1
port: 3306
database: entity_forge
username: root
password: roottenancy:
enabled: true
strategy: database
database:
driver: mysql
host: 127.0.0.1
port: 3306
database: entity_forge
username: root
password: rootphp bin/ef generate User --migration
php bin/ef migratephp bin/ef tenant:create tenant_1$app->boot([
'headers' => ['X-Tenant-ID' => 'tenant_1']
], true);
$repo = new UserRepository($app->getConfig());
$repo->create([
'name' => 'Ved',
'email' => 'ved@example.com'
]);
print_r($repo->findAll());All tenants share a single database.
entity_forge
βββ users
id
name
tenant_id
- Uses
tenant_idfor isolation - Lower infrastructure cost
- Easier to manage
Each tenant gets a dedicated database.
entity_forge (main DB)
βββ tenants
entity_forge_tenant_1
βββ users
entity_forge_tenant_2
βββ users
- Full data isolation
- No
tenant_idcolumn required - Better for enterprise use cases
{base_database}_{tenant_id}
Example:
entity_forge_tenant_1
entity_forge_tenant_2
Application
βββ Core (boot, config, schema)
βββ Tenant (context, resolver, provisioning)
βββ Database (connection, migrations)
βββ Generator (entity, repository, migration)
βββ Repository (data access layer)
Onboard β Create DB β Run Migrations β Register Tenant
entity_forge
βββ tenants
entity_forge_tenant_1
entity_forge_tenant_2
- Always call
boot()before using repositories - Never reuse repository instances across tenant switches
- Keep tenant registry in the main database
- Keep application data in tenant databases
php bin/ef generate User
php bin/ef generate:all
php bin/ef migrate
php bin/ef migrate:rollback
php bin/ef tenant:create tenant_1- Middleware for automatic tenant resolution
- Dependency Injection container
- API layer
Contributions are welcome. Feel free to open issues or pull requests.
MIT License