dr2gsistemas / erplibs
Librería PHP 8.4+ para ERP: ORM por atributos, migraciones, eventos, validación, serialización, caché, logging, auditoría y servidor API
v1.8.3
2026-10-31 02:56 UTC
Requires
- php: >=8.4
Requires (Dev)
- php-cs-fixer/shim: ^3.95
- phpstan/phpstan: ^2.3
- phpunit/phpunit: ^13.4
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Librería PHP 8.4+ para ERP: ORM por atributos, query builder validado, migraciones con batches, eventos, validación, serialización, caché, logging, auditoría, router HTTP y servidor API con CRUD especializado.
- PHP ≥ 8.4 · Dependencias de runtime: ninguna · BD: SQLite, MySQL, MariaDB, PostgreSQL
- Namespace:
Dr2g\ErpLibs\ - Paquete:
dr2gsistemas/erplibs
Instalación
Desde Packagist o VCS:
composer require dr2gsistemas/erplibs
En un monorepo, como repositorio de tipo path:
{
"repositories": [
{ "type": "path", "url": "libs/dr2gsistemas_erplibs", "options": { "symlink": true } }
],
"require": { "dr2gsistemas/erplibs": "*" }
}
Arranque
use Dr2g\ErpLibs\Core\DatabaseManager; use Dr2g\ErpLibs\Models\Model; $config = require 'config/database.php'; // estructura de config/database.php del paquete Model::setDbManager(new DatabaseManager($config));
Modelo
use Dr2g\ErpLibs\Models\Attributes\{Column, Hidden, Table}; use Dr2g\ErpLibs\Models\Model; #[Table(name: 'users')] class User extends Model { #[Column(type: 'VARCHAR(255)', validation: ['required', 'max:255'])] public string $name; #[Column(type: 'VARCHAR(190)', validation: ['required', 'email'])] public string $email; #[Hidden] #[Column(type: 'VARCHAR(255)')] public string $password_hash; } $user = User::create(['name' => 'Ada', 'email' => 'ada@example.com', 'password_hash' => 'x']); $user->fill(['name' => 'Grace'])->save(); User::find(1); User::query()->where('email', 'LIKE', '%@example.com')->orderBy('name')->limit(10)->get();
API por subsistema
| Subsistema | Clases | Documento |
|---|---|---|
| Core | Connection, DatabaseManager, QueryBuilder, ConnectionPool, CircuitBreaker |
README §Caché/§Logging |
| Models | Model, atributos Table/Column/PrimaryKey/Hidden/Validation |
§Modelo |
| Routing | Router, Route, RouteCollection, Request, Response, Controller |
docs/routing.md |
| View | Renderer (render, layout) |
docs/app-scaffold.md |
| Migrations | Migration, Blueprint, SchemaBuilder, MigrationManager, MigrationRepository, MigrationDetector |
§Migraciones |
| Events | Dispatcher (saving, creating, created, updating, updated, deleting, deleted) |
§Eventos |
| Validation | Validator, Rule (required, string, integer, numeric, email, min, max, boolean, Rule::extend) |
§Validación |
| Serialization | Resource (respeta #[Hidden]), Paginator (offset y cursor) |
§Serialización |
| Cache | CacheManager, CachesResponses, ArrayCache, FileCache, RedisCache, Redis\RedisConnection |
docs/cache.md |
| Log | Logger (PSR-3, sink inyectable) |
§Logging |
| Audit | AuditLogger, AuditStorageInterface, MemoryAuditStorage, Gdpr, RateLimiter |
§Audit |
| Testing | Testing\FakeConnection, Testing\ModelFactory |
§Testing |
Testing en consumidores
use Dr2g\ErpLibs\Testing\ModelFactory; $connection = ModelFactory::withFakeConnection(['last_insert_id' => 10]); $user = User::create(['name' => 'Ada', 'email' => 'a@b.c', 'password_hash' => 'x']); assert($user->id === 10); assert($connection->inserts[0]['table'] === 'users');
CLI
php vendor/bin/erplibs new:app ../mi-erp --namespace="Acme" --name="Mi ERP" php vendor/bin/erplibs make:migration create_posts_table php vendor/bin/erplibs migrate php vendor/bin/erplibs migrate:rollback --steps=1
Las aplicaciones web generadas también pueden habilitar Vue 3 + TypeScript y elegir un tema Material CSS propio o PrimeVue:
cd ../mi-erp php bin/app feature:enable vue php bin/app feature:enable material # o feature:enable primevue npm install npm run dr2g:dev
Desarrollo de la librería
composer install composer test # PHPUnit (suite unit) composer analyse # PHPStan nivel 8, sin baseline composer lint # PSR-12 composer check # los tres composer audit:release # qué archivos entran en el paquete
Tests de integración (MySQL):
DR2G_TEST_DSN="mysql:host=127.0.0.1;port=3306;dbname=dr2g_ci" \
DR2G_TEST_PASSWORD=root composer test:all
Estructura
src/Api ApiCrud (CRUD REST) y utilidades
src/Core Connection, QueryBuilder, DatabaseManager, modelo de resiliencia
src/Models Model + atributos
src/Migrations DDL, batches, detección desde atributos
src/Routing Router, Route/RouteCollection, Request/Response, Controller
src/View Renderer de vistas PHP con layout
src/Events Dispatcher
src/Validation Rule + Validator
src/Serialization Resource + Paginator
src/Cache CacheManager, CachesResponses, ArrayCache, FileCache, RedisCache, Redis\RedisConnection
src/Log Logger PSR-3
src/Audit Auditoría, GDPR, rate limiting
src/Security SQLInjectionGuard
src/Testing Dobles y helpers para consumidores
Documentación
README.md— esta guía (secciones detalladas abajo).docs/adr.md— decisiones de arquitectura.docs/routing.md— router HTTP.docs/cache.md— caché Redis/archivo/array para controllers.docs/app-scaffold.md—new:appy estructura de proyecto.docs/security.md— checklist OWASP.docs/performance.md— benchmarks.docs/acceptance.md— criterios de aceptación.CHANGELOG.md— versiones.
Requisitos y soporte
- PHP ≥ 8.4 (probado en 8.4 y 8.5).
- Extensiones:
pdoy el driver de la base de datos usada (pdo_sqlite,pdo_mysql,pdo_pgsql). ext-redises opcional (solo paraRedisCache).
Licencia y soporte
Ver LICENSE y SECURITY.md para reportar vulnerabilidades.