En producción
Aplicaciones reales de Nibiru generando ingresos reales. Maschinen Stockert vende maquinaria industrial en 12 países utilizando este marco.
Un marco digno de usar incluye cosas. El despliegue principal de Nibiru es el grupo Maschinen Stockert — un par de repositorios que alimentan una de las plataformas de comercio electrónico más grandes de la maquinaria industrial en Austria.
Los dos repos comparten módulos y una base de datos; dividen la responsabilidad por audiencia.
maschinen-stockert.de — catálogo público
El sitio para compradores. Navega y busca maquinaria industrial reacondicionada, visualiza páginas de detalles ricas con slugs amigables para SEO, regístrate para el anual Hausmesse feria comercial, solicita cotizaciones.
maschinen-stockert.de — catálogo público
Sección titulada «maschinen-stockert.de — catálogo público»La cara pública: donde los compradores industriales llegan, buscan y convierten.
¿Qué trae a bordo?
Sección titulada «¿Qué trae a bordo?»- Contenido multilingüe, con cada cadena visible recuperada de la base de datos
cms_template_textsclaveada por<controller>/<action>+ idioma. Los editores actualizan el texto desde el panel de administración sin necesidad de desplegar. - Búsqueda en motor Elasticsearch alimentada por máquinas, con filtrado sensible al tipo — dimensiones analizadas a partir de cadenas como
"2500 × 1200 mm"en rangos numéricos para que los compradores puedan buscar por tamaño. - URLs amigables para motores de búsqueda —
/maschine/drehmaschine-2500/42— generadas a partir del nombre de la máquina con normalización de umlauts alemanes (ä → ae,ß → ss). El ID numérico siempre va al final para que el enrutador pueda resolver un slug obsoleto. - Libros electrónicos interactivos PDF de Yumpu para catálogos descargables.
- Módulo Hausmesse para registro en ferias comerciales con acceso basado en roles.
Una acción representativa
Sección titulada «Una acción representativa»public function detailAction(){ $machineId = $this->getRequest('id', true); if (!$machineId) { http_response_code(404); return; }
$controllerPath = $this->getController() . '/detail'; $cmsTemplateTexts = Cms::init($this->getController()) ->loadCmsTemplateTextsByControllerPath($controllerPath, $this->language);
foreach ($cmsTemplateTexts as $t) { View::assign([ $t['cms_template_texts_text_identifier'] => $t['cms_template_texts_text_content'] ]); }
try { $machine = Machine::init()->getMachine((int) $machineId); } catch (\Throwable $e) { $machine = null; / DB blip → page still renders with fallback. }
$machineName = $machine['ms_machines_name'] ?? "Maschine #$machineId"; $protocol = (($_SERVER['HTTPS'] ?? '') === 'on') ? 'https' : 'http';
View::assign([ 'machine' => $machine, 'pageTitle' => "$machineName - Maschinen Stockert", 'metaDescription'=> "Details und Spezifikationen für $machineName", 'canonicalUrl' => $protocol . '://' . $_SERVER['HTTP_HOST'] . self::generateMachineSeoUrl($machineId, $machineName), ]);}50 líneas, sin contenedor DI, sin canal de validación, sin pila de middleware. Carga primero el contenido gestionado por CMS (así que un corte de base de datos en las máquinas no mata la página), extrae la máquina con una caída grácil, genera metadatos SEO siempre. La página completa se renderiza con dos viajes a la base de datos.
data.maschinen-stockert.de — admin & API
El cockpit interno. El personal de ventas gestiona el inventario, el contenido, los trabajos, las páginas del equipo, las inscripciones a ferias comerciales. Los desarrolladores e integraciones llaman a las API REST para buscar máquinas, sincronizar fabricantes, generar PDFs, consultar a Ollama para descripciones de máquinas AI.
data.maschinen-stockert.de — admin & API
Sección titulada «data.maschinen-stockert.de — admin & API»Los mismos módulos, tres veces los controladores y plantillas — porque las interfaces de administración y las API necesitan muchos puntos de entrada.
¿Qué hace
Sección titulada «¿Qué hace»- Page-tree CMS: los editores construyen páginas a partir de una plantilla Smarty; el plugin
Parserescanea los marcadores de posición{$identifier}en la plantilla y genera automáticamente la interfaz de usuario del panel de administración de campos editables. La plantilla es la especificación del formulario. - Role-based ACL: cada constructor del controlador de administración llama a
$this->user = new User(); $this->acl = new Acl(); $this->acl->init(); $this->user->validate();— tres líneas, listo. Ventas tiene solo lectura en el inventario; los administradores pueden editar; los socios ven solo sus listados asignados. - Public-API whitelist:
apiControllerpermite la búsqueda de máquinas, la obtención de categorías, la información del equipo y las llamadas a Ollama AI sin autenticación, luego requiere autenticación para todo lo demás. La lista blanca está directamente en el constructor — no hay errores de ordenamiento de middleware. - Machineryscout indexer: el módulo más pesado. Un rasgo de 2,200 líneas que extrae máquinas + atributos + imágenes + documentos de MySQL a través de
JSON_ARRAYAGG, normaliza los tipos ("2500 x 1200"→dimension_width: 2500.0, dimension_height: 1200.0), sustituye marcadores de posición para imágenes faltantes y envía filas a Elasticsearch.
El patrón del Analizador — generación automática de interfaces de usuario del editor desde una plantilla
Sección titulada «El patrón del Analizador — generación automática de interfaces de usuario del editor desde una plantilla»$parser = Parser::init();$cmsEditable = $parser->parseSmartyTemplateByTemplateId($templateId);View::assign([ 'cmsEditable' => $cmsEditable, 'cmsTemplateTextForm'=> Cms::textsEditingForm('/admin/texts/create/text/new'),]);Inserta una nueva plantilla Smarty en el sistema, el editor sabe de inmediato cuáles son los marcadores de posición editables. No hay un paso de “registrar los campos del formulario”.
¿Qué realmente es especial, resumido?
Sección titulada «¿Qué realmente es especial, resumido?»Los cinco diferenciadores a continuación se extraen de los códigos fuente anteriores. Cada uno enlaza a su evidencia en la página ¿Por qué Nibiru.
| ¿Qué hace Nibiru? | ¿Qué hace Laravel/Symfony? | |
|---|---|---|
| Copia de página | Cargada desde la BD por <controller>/<action> por solicitud, gestionada por el editor. | Codificada en Blade / JSON de traducción; desplegar para cambiar. |
| Composición del módulo | 13 rasgos por módulo, sin DI. | Proveedores de servicios + contenedor IoC. |
| ORM | SQL directo, MySQL JSON_ARRAYAGG, Pdo::fetchAll. | Entidades Eloquent / Doctrine + proxies de carga diferida. |
| Auth | 3 líneas en el constructor del controlador. | Pila de middleware + clases de política + portales. |
| Eventos | SplSubject + SplObserver de la librería estándar de PHP. | Despachador de eventos personalizado + registro de oyentes + cola. |
Lee la desglose completa con referencias de código →
¿Qué se requirió?
Sección titulada «¿Qué se requirió?»Maschinen Stockert es un sitio web real y rentable que vende maquinaria en 12 países. Movió 161 migraciones SQL con marcas de tiempo a producción sin ningún framework de migración, 74,000 líneas de PHP en dos repositorios sin contenedor de servicios, y 18 módulos que se componen con rasgos en lugar de herencia. El equipo que lo construyó y opera es pequeño.
Eso es la prueba.
Si estás trabajando con un equipo pequeño y en un presupuesto apretado, donde los despliegues y el tiempo de inactividad cuestan dinero real — eso es el punto fuerte de Nibiru. Lee la Guía Rápida, luego regresa.