PHP code example of innodite / laravel-module-maker

1. Go to this page and download the library: Download innodite/laravel-module-maker library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

innodite / laravel-module-maker example snippets


// Controlador — uso de renderModule()
class CentralUserController extends Controller
{
    use RendersInertiaModule;

    public function index(): JsonResponse
    {
        $users = $this->service->paginate();
        return response()->json($users);
    }

    public function create(): \Inertia\Response
    {
        return $this->renderModule('CentralUserCreate');
        // Retorna la vista Inertia — sin datos de negocio
    }
}

->withMiddleware(function (Middleware $middleware) {
    $middleware->appendToGroup('web', [
        \Innodite\LaravelModuleMaker\Middleware\InnoditeContextBridge::class,
    ]);
})

Route::middleware('innodite.bridge')->group(fn() => ...);

use Innodite\LaravelModuleMaker\Contracts\InnoditeUserPermissions;

class User extends Authenticatable implements InnoditeUserPermissions
{
    public function getInnoditePermissions(): array
    {
        return $this->permissions->pluck('name')->toArray();
    }
}

// {{CENTRAL_ROUTES_END}}

// {{TENANT_ROUTES_END}}

// Acceso programático al log
ModuleAuditor::readLog();  // devuelve array de entradas
ModuleAuditor::logPath();  // devuelve ruta absoluta al archivo de log
bash
php artisan innodite:doctor
bash
# Configuración make-module.php
php artisan vendor:publish --tag=module-maker-config

# Todas las plantillas de golpe — solo si de verdad vas a personalizarlas todas
php artisan vendor:publish --tag=module-maker-stubs

# contexts.json de ejemplo
php artisan vendor:publish --tag=module-maker-contexts

Modules/UserManagement/
└── Role/                                  ← la subfuncionalidad manda
    ├── Models/Central/CentralRole.php
    ├── Http/Controllers/Central/CentralRoleController.php
    ├── Http/Requests/Central/CentralRoleStoreRequest.php
    ├── Http/Requests/Central/CentralRoleUpdateRequest.php
    ├── Services/Central/CentralRoleService.php
    ├── Services/Contracts/Central/CentralRoleServiceInterface.php
    ├── Repositories/Central/CentralRoleRepository.php
    ├── Repositories/Contracts/Central/CentralRoleRepositoryInterface.php
    └── Database/Migrations/Central/..._create_roles_table.php
bash
php artisan innodite:doctor
bash
php artisan innodite:deploy stage --context=central
php artisan innodite:deploy stage --context=central --dry-run   # ver el plan sin tocar la base
bash
php artisan innodite:migrate-one "Invoice:Central/2026_08_01_120000_crea_facturas.php"

# Sin confirmación interactiva
php artisan innodite:migrate-one "Invoice:Central/2026_08_01_120000_crea_facturas.php" --yes

# Ver qué haría
php artisan innodite:migrate-one "Invoice:Central/2026_08_01_120000_crea_facturas.php" --dry-run
bash
# Aplicación única
php artisan innodite:deploy production

# Multitenant: dos despliegues, contra dos bases de datos
php artisan innodite:deploy production --context=central
php artisan innodite:deploy stage --context=tenant
bash
# El contrato completo de una subfuncionalidad
php artisan innodite:test Invoice Payment

# En multitenant, diciendo en qué contexto vive
php artisan innodite:test Invoice Payment --context=central

# Acotando dentro de una pieza
php artisan innodite:test Invoice Payment --filter=test_no_se_ve_sin_permiso

# Sin corte temprano, para ver el grupo entero de una pasada
php artisan innodite:test Invoice Payment --continuar

Modules/User/
├── Docs/  architecture.md · history.md · schema.md          ← del MÓDULO
├── Routes/web.php · tenant.php                              ← del MÓDULO, uno por contexto
├── Providers/Central/CentralUserServiceProvider.php         ← del MÓDULO, uno por contexto
│             Tenant/TenantUserServiceProvider.php
├── Database/Seeders/Application/                            ← del MÓDULO: los 3 maestros
│       ├── Central/CentralUserApplication{Stage,Production,Permissions}Seeder.php
│       └── Tenant/TenantUserApplication…
│
├── User/                                                    ← SUBFUNCIONALIDAD, autocontenida
│   ├── Models/Central/CentralUser.php  ·  Tenant/TenantUser.php
│   ├── Http/Controllers/{Ctx}/{Ctx}UserController.php
│   │     Requests/{Ctx}/{Ctx}User{Store,Update}Request.php
│   ├── Services/{Ctx}/…  +  Services/Contracts/{Ctx}/…
│   ├── Repositories/{Ctx}/…  +  Repositories/Contracts/{Ctx}/…
│   ├── Database/Factories/{Ctx}/ · Migrations/{Ctx}/ · Seeders/{Ctx}/   (las 6 piezas)
│   ├── Tests/Feature/{Ctx}/                                 (las 6 piezas + TestCase)
│   ├── resources/js/Pages/{Ctx}/ · __tests__/{Ctx}/
│   └── Jobs/{Ctx}/ · Notifications/{Ctx}/ · Console/Commands/{Ctx}/ · Exceptions/{Ctx}/
│                                                            ← vacías, con .gitkeep
└── Role/                                                    ← la misma forma
bash
# 1 · Configurar el proyecto — se elige el modo UNA vez
php artisan innodite:module-setup --mode=multitenant --tenancy=stancl --frontend=default

# 2 · El primer módulo, en el contexto que sea
php artisan innodite:make-module User --context=central

# 3 · Las demás subfuncionalidades, y el otro contexto
php artisan innodite:add-entity User Role --context=central
php artisan innodite:add-entity User User --context=tenant

# 4 · Levantar
php artisan innodite:deploy stage --context=central
php artisan innodite:deploy stage --context=tenant --all

# 5 · El contrato de pruebas
php artisan innodite:test User Role --context=central
js
// La pantalla generada lee lo que el puente compartió:
const { route_prefix, permission_prefix } = usePage().props.auth.context

// central → 'central'   ·   inquilino → 'tenant'   ·   aplicación única → null
bash
php artisan vendor:publish --tag=module-maker-stubs