Download the PHP package innodite/laravel-module-maker without Composer

On this page you can find all versions of the php package innodite/laravel-module-maker. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.

FAQ

After the download, you have to make one include require_once('vendor/autoload.php');. After that you have to import the classes with use statements.

Example:
If you use only one package a project is not needed. But if you use more then one package, without a project it is not possible to import the classes with use statements.

In general, it is recommended to use always a project to download your libraries. In an application normally there is more than one library needed.
Some PHP packages are not free to download and because of that hosted in private repositories. In this case some credentials are needed to access such packages. Please use the auth.json textarea to insert credentials, if a package is coming from a private repository. You can look here for more information.

  • Some hosting areas are not accessible by a terminal or SSH. Then it is not possible to use Composer.
  • To use Composer is sometimes complicated. Especially for beginners.
  • Composer needs much resources. Sometimes they are not available on a simple webspace.
  • If you are using private repositories you don't need to share your credentials. You can set up everything on our site and then you provide a simple download link to your team member.
  • Simplify your Composer build process. Use our own command line tool to download the vendor folder as binary. This makes your build process faster and you don't need to expose your credentials for private repositories.
Please rate this library. Is it a good library?

Informations about the package laravel-module-maker

🏗️ Innodite Laravel Module Maker

Tests Coverage Latest Version PHP Laravel

v3.5.3 — Generador de módulos Laravel con arquitectura de contextos dinámicos (Central, Shared, Tenant) para proyectos multi-tenant. Genera backend completo, inyecta rutas y crea vistas Vue 3 listas para usar — todo con un solo comando. Soporta múltiples entidades por módulo con subcarpeta aislada por entidad ({Tipo}/{Contexto}/{Entidad}/).

⚠️ Versiones Deprecadas

Se consideran deprecados los tags históricos con referencias heredadas a software/proyecto externo.

Tags deprecados:

Versión mínima recomendada para uso nuevo:

Nota: la deprecación es de soporte/uso recomendado. No se reescribe el historial Git publicado.


📋 Tabla de Contenidos

Nuevos en v3.5.x:


✅ Requisitos

Dependencia Versión mínima
PHP 8.2+
Laravel 11.0+
illuminate/support ^11.0|^12.0
illuminate/console ^11.0|^12.0
illuminate/filesystem ^11.0|^12.0
illuminate/routing ^11.0|^12.0
@inertiajs/vue3 ^1.0 (frontend)
Vue ^3.0 (frontend)

Compatible opcionalmente con stancl/tenancy y spatie/laravel-permission.


🚀 Instalación

Al instalar por primera vez, el paquete detecta la ausencia de configuración y sugiere el setup en consola.

Inicializar el proyecto (requerido)

Crea module-maker-config/ en la raíz del proyecto con:

Publicar assets manualmente


🗺️ Tabla comparativa de contextos

Los 4 contextos disponibles cubren todos los escenarios de un proyecto multi-tenant:

Contexto key Prefijo de clase Carpeta PHP Carpeta Vue Archivo de rutas Nombre de ruta ejemplo Archivos generados
central Central Central/ Pages/Central/ routes/web.php central.users.index 24
shared Shared Shared/ Pages/Shared/ web.php + tenant.php central.shared.invoices.index 16
tenant_shared TenantShared Tenant/Shared/ Pages/Tenant/Shared/ routes/tenant.php roles.index (sin prefijo) 17
tenant (ej: INNODITE) TenantINNODITE Tenant/INNODITE/ Pages/Tenant/INNODITE/ routes/tenant.php innodite.products.index 20

Descripción rápida de cada contexto:

  • central → Panel administrativo global. Rutas en web.php. Prefijo Central.
  • shared → Código híbrido accesible tanto desde el panel central como desde el panel tenant. Inyecta rutas en DOS archivos simultáneamente.
  • tenant_shared → Estándar para todos los tenants. Sin prefijo de URL ni de nombre de ruta.
  • tenant → Tenants específicos del proyecto (INNODITE, ACME, etc.). Un array en contexts.json, cada entrada genera su propio espacio aislado.

🖥️ Arquitectura Frontend

Regla fundamental — No negociable en este paquete.

Responsabilidad Tecnología
Navegación entre páginas Inertia.js (router.visit(), router.get())
Carga y mutación de datos axios (GET, POST, PUT, DELETE)
Contexto activo y permisos Props de Inertia — compartidos por InnoditeContextBridge

Los controladores utilizan el trait RendersInertiaModule y el método renderModule() para devolver la vista Inertia correcta según el contexto. Nunca pasan datos de negocio por props de Inertia.

Las vistas Vue son shells que se autocargan al montarse vía axios. Inertia nunca transporta datos de negocio; solo gestiona la navegación SPA.


🛠️ Guía de comandos

innodite:make-module — Generador principal

Genera backend completo + vistas Vue en un solo comando.

Flags de componentes:

Flag Componente generado
-M / --model Modelo Eloquent con $table definida
-C / --controller Controlador con RendersInertiaModule + inyección de rutas CRUD
-S / --service Servicio + Interface en Services/Contracts/
-R / --repository Repositorio + Interface en Repositories/Contracts/
-G / --migration Migración anónima contextualizada
-Q / --request Form Request validado (Store y Update para Central/Tenant, uno para Shared/TenantShared)

Validaciones de seguridad:


innodite:add-entity — Agregar entidad a módulo existente

Agrega una nueva entidad a un módulo ya existente, generando sus componentes dentro de la subcarpeta de entidad correspondiente. Diseñado para módulos multi-entidad como UserManagement (con User, Role, Permission, Module).

Firma:

Argumento Descripción
module Nombre del módulo existente (ej: UserManagement)
entity Nombre de la entidad nueva (ej: Role, Permission)
--context= ID del contexto destino (ej: central, acme)
-M a -Q Mismos flags que make-module (sin flags = genera todos los componentes)
--no-routes Omite la inyección de rutas

Ejemplo de archivos generadosadd-entity UserManagement Role --context=central:

Diferencia con make-module:

make-module add-entity
Crea módulo nuevo
Agrega a módulo existente
Valida que el módulo exista primero
Sin flags = genera todos los componentes
Naming convention intacta

innodite:module-setup — Configuración inicial

Crea la estructura de configuración del paquete en la raíz del proyecto. Debe ejecutarse una sola vez al inicializar un nuevo proyecto que use este paquete.


innodite:module-check — Diagnóstico de entorno

Verifica el entorno del proyecto e informa sobre:

  1. contexts.json — validez, estructura y claves requeridas
  2. Permisos de escritura en Modules/, routes/, storage/logs/
  3. Colisiones de nombres entre módulos y ServiceProviders
  4. Últimas 5 entradas del log de auditoría

innodite:check-env — Contrato de Datos Frontend-Backend

Verifica el bridge Inertia y, si algo falta, imprime el bloque de código exacto a copiar:

  1. Modelo User — HasRoles (Spatie) o InnoditeUserPermissions
  2. HandleInertiaRequestsauth.permissions compartido
  3. InnoditeContextBridge — registrado en el stack web

innodite:publish-frontend — Composables Vue 3

Publica en resources/js/Composables/:


innodite:migrate-plan — Orquestador de Migraciones por Manifiesto

Ejecuta migraciones en el orden exacto definido en un manifiesto JSON. Es ideal cuando hay dependencias entre módulos y contextos. Antes de ejecutar, valida la conexión objetivo y verifica que la base de datos exista para evitar procesos parciales o lanzados contra una BD incorrecta.

Formato de coordenadas soportado:

Ejemplo real de manifiesto (module-maker-config/migrations/tenant_innodite_order.json):

Cómo resuelve rutas internas:

Qué valida el comando:

Mensajes de error claros:

Si una coordenada no existe, el comando responde con la ruta esperada para corregirla rápidamente. Si la base de datos objetivo no existe, corta el proceso antes de ejecutar migraciones o seeders.


innodite:migrate-one — Ejecutar una Migración Específica

Permite ejecutar una coordenada de migración puntual sin correr el manifiesto completo. Está pensado para casos quirúrgicos donde necesitas lanzar una sola migración y mantener sincronizado el manifiesto correspondiente.

Qué hace internamente:

  1. Resuelve la ruta exacta del archivo de migración desde la coordenada.
  2. Detecta automáticamente el manifiesto objetivo según el contexto.
  3. Si la coordenada aplica a múltiples manifiestos, muestra los destinos y pide confirmación.
  4. Muestra antes de ejecutar:
    • Tipo: migración
    • Coordenada
    • Conexión
    • Base de datos
    • Manifiesto destino
    • Ruta real del archivo
  5. Si la coordenada no está registrada en el manifiesto, la agrega primero.
  6. Ejecuta solo la migración indicada.

Reglas de resolución:

Importante:


innodite:seed-one — Ejecutar un Seeder Específico

Permite ejecutar un seeder puntual sin correr el manifiesto completo. Está pensado para casos quirúrgicos donde necesitas lanzar un solo seeder y mantener sincronizado el manifiesto correspondiente.

Qué hace internamente:

  1. Resuelve el FQCN (clase completa) del seeder desde la coordenada.
  2. Detecta automáticamente el manifiesto objetivo según el contexto.
  3. Si la coordenada aplica a múltiples manifiestos, muestra los destinos y pide confirmación.
  4. Muestra antes de ejecutar:
    • Tipo: seeder
    • Coordenada
    • Conexión
    • Base de datos
    • Manifiesto destino
    • Clase real que va a ejecutar
  5. Si la coordenada no está registrada en el manifiesto, la agrega primero.
  6. Ejecuta solo el seeder indicado.

Reglas de resolución:

Importante:


innodite:migration-sync — Sincronización Automática de Manifiestos

Escanea los módulos y agrega al manifiesto las migraciones y seeders que aún no están registradas.

Comportamiento de sync:

  1. Si no envías --manifest, lee module-maker-config/contexts.json y propone:
    • central_order.json
    • tenant_{permission_prefix}_order.json por cada tenant configurado.
  2. Pide confirmación en consola antes de generar/sincronizar múltiples manifiestos (omite prompt con --yes).
  3. Crea module-maker-config/migrations/ si no existe.
  4. Crea cada manifiesto faltante (estructura vacía).
  5. Escanea:
    • Modules/*/Database/Migrations/**
    • Modules/*/Database/Seeders/**
  6. Convierte hallazgos a coordenadas.
  7. Filtra por alcance de manifiesto:
    • central_order.json => contextos Central y Shared.
    • tenant_*.json => Shared + Tenant/Shared + contexto Tenant/{X} del tenant objetivo.
  8. Hace append solo de faltantes (sin duplicar).

Importante:

Cuándo usarlo en la práctica:


innodite:test-module — Ejecutar Tests con Coverage

Características:

innodite:test-sync — Sincronizar Tests/test-config.json

Genera o actualiza el archivo test-config.json dentro de la carpeta Tests/ de cada módulo, leyendo los contextos desde module-maker-config/contexts.json.

Para testing, el sync solo genera contextos válidos de ejecución:

No genera shared ni tenant_shared, porque esos contextos no representan una base de datos de prueba autónoma.

Reglas del sync:

Ejemplo de Modules/User/Tests/test-config.json:

Requisitos para Coverage:

Ejemplo de Salida:


📁 Archivos generados por contexto

Esta sección muestra la lista exacta de archivos que el paquete genera para el módulo User en cada uno de los 4 contextos.


Contexto central — 24 archivos

v3.5.x — Los componentes principales (Model, Controller, Requests, Service, Repository, Migration) se generan dentro de una subcarpeta con el nombre de la entidad: {Tipo}/{Contexto}/{Entidad}/. Las vistas Vue, Tests, Jobs, Notifications y Commands mantienen su estructura anterior (sin subcarpeta de entidad).


Contexto shared — 16 archivos


Contexto tenant_shared — 17 archivos


Contexto tenant (ej: INNODITE) — 20 archivos


🔄 Flujo completo por contexto

Esta sección documenta el flujo de generación completo para cada contexto: qué archivos crea, dónde los ubica y cómo inyecta las rutas.


Contexto central

Ruta inyectada en routes/web.php

Resolución de contextRoute()


Contexto shared

Dualidad de rutas — inyección simultánea en DOS archivos

El contexto shared es único: sus rutas son accesibles tanto desde el panel central como desde el panel tenant. El generador inyecta rutas en dos archivos simultáneamente.

En routes/web.php (acceso desde el panel central):

En routes/tenant.php (acceso desde el panel tenant):

Resolución de contextRoute() en shared

El mismo componente Vue resuelve diferente según el panel activo, gracias a auth.context.route_prefix inyectada por InnoditeContextBridge:

Las vistas Vue no cambian — el composable adapta la ruta automáticamente según el contexto activo en sesión.


Contexto tenant_shared

Ruta inyectada en routes/tenant.php

El contexto tenant_shared tiene route_prefix: null — las rutas se definen sin prefijo URL para que cada tenant acceda directamente bajo su propio dominio.

Nota: Sin route_prefix, el nombre de ruta tampoco lleva prefijo de contexto. contextRoute('roles.index') devuelve simplemente 'roles.index'.


Contexto tenant (tenant específico — ej: INNODITE)

El paquete resuelve innodite buscando en el array tenant de contexts.json por name, class_prefix o slug derivado del nombre.

Ruta inyectada en routes/tenant.php

Resolución de contextRoute()


🧩 Composables Vue 3

Los composables se publican con php artisan innodite:publish-frontend en resources/js/Composables/.

useModuleContext — Detección automática de contexto

Lee auth.context.route_prefix desde las props de Inertia compartidas por InnoditeContextBridge y antepone automáticamente el prefijo correcto a cualquier clave de ruta.

El mismo componente Vue funciona en cualquier contexto sin cambios — el composable resuelve la ruta correcta según la sesión activa.


usePermissions — Verificación de permisos del usuario

Lee auth.permissions desde las props de Inertia y permite verificar permisos de forma declarativa en las plantillas Vue.

Estrategia dual: verifica {prefix}.{perm} y {perm} plano simultáneamente. El mismo componente funciona en cualquier contexto sin cambios.


Flujo de datos en las vistas Vue generadas

Ejemplo — CentralUserIndex.vue

Ejemplo — CentralUserCreate.vue

Ejemplo — CentralUserEdit.vue


🔧 Stubs contextuales

El sistema de stubs de v3.1.0 organiza las plantillas en 4 carpetas independientes, una por contexto. Esto permite personalizar la salida generada para cada contexto sin afectar los demás.

Estructura de stubs

Publicar stubs para personalización

Copia las 4 carpetas de stubs a module-maker-config/stubs/contextual/ en tu proyecto. A partir de ese momento, el generador usará tus stubs en lugar de los del paquete.

Variables disponibles en los stubs

Variable Descripción Ejemplo
{{MODULE}} Nombre del módulo User
{{CLASS_PREFIX}} Prefijo de clase del contexto Central
{{NAMESPACE}} Namespace completo de la clase Modules\User\Http\Controllers\Central
{{CLASS_NAME}} Nombre completo de la clase CentralUserController
{{MODEL_CLASS}} Clase del modelo CentralUser
{{SERVICE_INTERFACE}} Interface del servicio CentralUserServiceInterface
{{ROUTE_PREFIX}} Prefijo de ruta del contexto central
{{TABLE_NAME}} Nombre de la tabla central_users

🌉 Bridge Frontend-Backend

Middleware InnoditeContextBridge

Intercepta cada request e inyecta vía Inertia::share():

Prop Valor ejemplo
auth.context.route_prefix central, innodite, central.shared
auth.context.permission_prefix central, innodite, tenant
auth.permissions ['central.users.edit', 'users.view', ...]

Cadena de resolución de permisos:

  1. Spatie Permission → $user->getAllPermissions()->pluck('name')
  2. InnoditeUserPermissions$user->getInnoditePermissions()
  3. Fail-safe → [] + Warning en log

Registrar en bootstrap/app.php (Laravel 11+):

Alias para rutas específicas:


Interfaz InnoditeUserPermissions


⚙️ Estructura de contextos (contexts.json)

El array tenant puede contener múltiples entradas, una por cada tenant específico del proyecto. Cada entrada genera su propio espacio de nombres, carpetas y marcador de rutas aislado.

Claves del contexto tenant_shared con route_prefix: null

Es el único contexto sin prefijo de URL ni de nombre de ruta. contextRoute('roles.index') devuelve simplemente 'roles.index' — diseñado para código estándar que se ejecuta bajo el dominio de cada tenant.


🌳 Estructura de árbol de un módulo generado

El siguiente árbol corresponde a innodite:make-module User --context=central (módulo completo, 24 archivos).

Patrón v3.5.x: Los componentes principales siguen {Tipo}/{Contexto}/{Entidad}/{Archivo}.

Con innodite:add-entity User Role --context=central, se añade dentro de Modules/User/ una subcarpeta Role/ paralela a User/ en cada tipo de componente.


📐 Convenciones de nomenclatura

Contexto Prefijo de clase Ejemplo Vue Ejemplo PHP
central Central CentralUserIndex.vue CentralUserController.php
shared Shared SharedInvoiceIndex.vue SharedInvoiceService.php
tenant_shared TenantShared TenantSharedRoleIndex.vue TenantSharedRoleRepository.php
tenant (INNODITE) TenantINNODITE TenantINNODITEUserIndex.vue TenantINNODITEUserController.php

Reglas adicionales:


🔀 Flujo de inyección de rutas

Marcadores en routes/web.php

Marcadores en routes/tenant.php

Proceso interno de inyección

Contexto shared — Dualidad de rutas

Archivo destino Prefijo URL Nombre de ruta Marcador
routes/web.php central/shared central.shared. {{CENTRAL_ROUTES_END}}
routes/tenant.php tenant/shared tenant.shared. {{TENANT_SHARED_ROUTES_END}}

📋 Resumen de todos los comandos

Comando Descripción
innodite:make-module {Name} Genera módulo completo con backend, vistas Vue y rutas
innodite:add-entity {Module} {Entity} Agrega una entidad a un módulo existente
innodite:module-setup Inicializa configuración del paquete en el proyecto
innodite:module-check Diagnóstico de configuración, permisos y conflictos
innodite:check-env Verifica integración frontend-backend (bridge Inertia)
innodite:publish-frontend Publica composables Vue 3 (useModuleContext, usePermissions)
innodite:migrate-plan Ejecuta migraciones/seeders por manifiesto y orden explícito
innodite:migrate-one Ejecuta una migración puntual por coordenada
innodite:seed-one Ejecuta un seeder puntual por coordenada
innodite:migration-sync Escanea módulos y sincroniza faltantes en manifiestos
innodite:test-module Ejecuta tests de módulos con contexto y coverage (HTML, Text, Clover)
innodite:test-sync Sincroniza Modules/{Modulo}/Tests/test-config.json desde contexts.json
vendor:publish --tag=module-maker-config Publica make-module.php
vendor:publish --tag=module-maker-stubs Publica stubs contextuales personalizables
vendor:publish --tag=module-maker-contexts Publica contexts.json de ejemplo
vendor:publish --tag=module-maker-frontend Publica composables Vue 3

📊 Auditoría

storage/logs/module_maker.log — formato NDJSON (una entrada JSON por línea):

Evento Cuándo se registra
module.created Módulo completo generado correctamente
module.components Componentes individuales añadidos a módulo existente
routes.injected Rutas inyectadas exitosamente en el proyecto
module.rollback Rollback ejecutado tras error durante la generación

🧪 Pruebas

Los tests generados por make-module se ubican en:


📏 Estándares de código

El paquete incluye configuración de PHP CS Fixer compatible con PSR-12. Todos los archivos PHP generados incluyen declare(strict_types=1) por defecto.


📦 Publicar en Packagist / repositorio privado

Repositorio público (Packagist)

Luego registrar el repositorio en packagist.org con la URL del repositorio.

Repositorio privado (VCS)

Agregar en el composer.json del proyecto consumidor:


📝 Changelog

Ver CHANGELOG.md para el historial completo de versiones.


📄 Licencia

MIT — Anthony Filgueira


All versions of laravel-module-maker with dependencies

PHP Build Version
Package Version
Requires php Version ^8.2
illuminate/support Version ^11.0|^12.0
illuminate/console Version ^11.0|^12.0
illuminate/filesystem Version ^11.0|^12.0
illuminate/routing Version ^11.0|^12.0
Composer command for our command line client (download client) This client runs in each environment. You don't need a specific PHP version etc. The first 20 API calls are free. Standard composer command

The package innodite/laravel-module-maker contains the following files

Loading the files please wait ...