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
}
}
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
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