Skip to content

Paquete o aplicación

LaraPack genera la misma arquitectura en dos sitios: dentro de un paquete de Composer o directamente dentro de una aplicación Laravel. Los modelos, las políticas, los requests y el módulo de interfaz son iguales. Cambia dónde van, cómo se llaman sus rutas, quién registra los proveedores y cómo se compila la interfaz.

Cómo lo decide

Por el campo type del composer.json de la raíz:

typeModo
library, o sin typePaquete: escribe en src/
Cualquier otro valor; en Laravel, projectAplicación: escribe en app/

El namespace sale de autoload.psr-4: la entrada que apunta a src/ en un paquete, o a app/ en una aplicación (App\).

No hay opción para forzar un modo: si LaraPack escribe donde no esperas, revisa el type.

Las diferencias

AspectoPaqueteAplicación
Códigosrc/, con el namespace del paqueteapp/, con App\
Archivo de rutasroutes/api/models/<snake>.phproutes/api/models/<snake>.php
URLapi/<namespace>/<snake>/..., p. ej. api/acme/catalogo/order_line/indexapi/app/<snake>/..., p. ej. api/app/order_line/index
Nombres de rutaapi.acme.catalogo.order_line.*api.app.order_line.*
ProveedoresEn extra.laravel.providers del composer.json: Laravel los descubreHay que añadirlos a bootstrap/providers.php
FactoriesNamespace del paqueteDatabase\Factories
TestsTestCase de Testbench y un tests/User.php propioTests\Feature\Models, con el tests/TestCase.php de la aplicación; inician sesión con la factory del modelo de auth.providers.users.model
Módulo de interfazresources/vue o resources/react, con su propio package.json y vite.config.jsresources/<ui>/index.js y resources/<ui>/src/, sin package.json
Nombre npm del módulovendor-paquete (Vue) y vendor-paquete-react (React)No se publica
Dependencias npm del móduloLas declara su package.jsonLas declara el package.json de la aplicación
Configuración de la exportaciónEl archivo de configuración del paquete, p. ej. config/acmecatalogo.phpconfig/larapack.php, que crea larapack:config
Vistas de ExcelCon el namespace de vistas del paqueteSin namespace: excel.<modelo>, en resources/views/excel
Migraciones de creación que LaraPack no escribióSe omiten: no se comparan ni se alteran

Las rutas

El RouteServiceProvider generado monta cada archivo de routes/api/models/ con el namespace en el prefijo. Para Acme\Catalogo y para App\:

php
Route::middleware('api')
    ->prefix('api/acme/catalogo/' . $name)
    ->as('api.acme.catalogo.' . $name . '.')
    ->group($file);
php
Route::middleware('api')
    ->prefix('api/app/' . $name)
    ->as('api.app.' . $name . '.')
    ->group($file);

$name es el nombre del archivo, el modelo en snake_case: OrderLine va a order_line.php. El API_ROUTE_PREFIX del contrato JS reconstruye ese mismo prefijo, y larapack:verify comprueba que coincidan.

Los proveedores

json
{
    "extra": {
        "laravel": {
            "providers": [
                "Acme\\Catalogo\\Providers\\AppServiceProvider",
                "Acme\\Catalogo\\Providers\\AuthServiceProvider",
                "Acme\\Catalogo\\Providers\\EventServiceProvider",
                "Acme\\Catalogo\\Providers\\RouteServiceProvider"
            ]
        }
    }
}
php
return [
    App\Providers\AppServiceProvider::class,
    App\Providers\EventServiceProvider::class,
    App\Providers\RouteServiceProvider::class,
];

En un paquete, larapack:new o larapack:providers los declaran y la aplicación que instala el paquete los descubre sola. En una aplicación, larapack:route-service-provider y larapack:event-service-provider los crean, pero Laravel no descubre proveedores en el composer.json de una aplicación: tienes que registrarlos. Sin el de rutas no existe ningún endpoint generado; sin el de eventos, la exportación nunca avisa.

La aplicación base ya los trae registrados.

El módulo de interfaz

En un paquete el módulo es un paquete npm propio. Se publica, la aplicación lo instala y lo monta a mano: carga sus traducciones, monta sus rutas bajo /admin e instala el plugin (Vue) o registra sus rutas (React). Ver Usarlo desde una aplicación.

packages/catalogo/
  composer.json                → acme/catalogo               (Composer)
  resources/vue/package.json   → acme-catalogo               (npm)
  resources/react/package.json → acme-catalogo-react         (npm)

En una aplicación el módulo no se publica: lo compila el Vite de la aplicación. LaraPack no escribe package.json ni vite.config.js dentro de resources/, y tu package.json tiene que declarar las dependencias del módulo (los paquetes de interfaz de innoboxrr, el router y el estado). La aplicación base ya las declara y carga el módulo sola.

La exportación

PaqueteAplicación
ConfiguraciónLa del paquete, p. ej. config/acmecatalogo.php para Acme\Catalogoconfig/larapack.php
Claves que lee la exportaciónexcel_view, notification_via, export_disk (y user_class)larapack.excel_view, larapack.notification_via, larapack.export_disk
Por omisiónCorreo y disco localCorreo y disco local, también sin el archivo

En una aplicación, larapack:config crea config/larapack.php y nunca escribe en config/app.php, que es de Laravel. Para avisar también en la base de datos, crea la tabla de notificaciones con php artisan make:notifications-table y añade database a notification_via.

Las migraciones

En los dos modos, al reimportar LaraPack compara las columnas del JSON con las migraciones de la tabla y escribe <fecha>_alter_<tabla>_table.php con lo que cambia.

En una aplicación hay un caso más: una migración de creación que LaraPack no escribió se omite. La de users que trae Laravel es el ejemplo típico: no se compara con el laraimport ni se escriben alteraciones contra ella. Si esa tabla necesita más columnas, escribe tú la migración. La aplicación base ya trae una que añade payload y el borrado lógico a users.

Cuál elegir

Elige un paquete si…Elige la aplicación si…
La funcionalidad se va a usar en más de una aplicación.El dominio es de esta aplicación y de ninguna otra.
Quieres publicarla y versionarla aparte, con su CI y su CHANGELOG.Quieres generar y ver el resultado sin publicar nada.
Otro equipo la mantiene.Es la aplicación base con tus modelos.

Un paquete cuesta más al principio: su propio repositorio, su CI, su publicación y el montaje en cada aplicación. A cambio, cada aplicación lo actualiza con Composer y npm.

LaraPack no tiene un comando para mover modelos de una aplicación a un paquete. Si lo necesitas, crea el paquete con larapack:new, lleva a su laraimport.json las declaraciones de esos modelos, genera allí y mueve tu lógica a los huecos del paquete.