Aller au contenu
Nibiru docsv0.9.2

En production

Les applications réelles de Nibiru génèrent des revenus réels. Maschinen Stockert vend du matériel industriel dans 12 pays sur ce cadre.

Stable Reading time ~ 5 min Edit on GitHub

Un cadre à utiliser vaut le coup. Le déploiement majeur Nibiru est le groupe Maschinen Stockert — un couple de dépôts alimentant l’une des plus grandes plateformes e-commerce de machines industrielles en Autriche.

Les deux dépôts partagent des modules et une base de données ; ils divisent la responsabilité par public.


Une machine CNC industrielle sur un chantier à l'heure dorée.

10 contrôleurs · 18 modules · 150 modèles · 36,289 lignes de PHP

maschinen-stockert.de — catalogue public

Le site destiné aux acheteurs. Parcourez et recherchez des machines industrielles reconditionnées, consultez des pages de détails riches avec des slugs amicaux pour le référencement, inscrivez-vous au salon annuel Hausmesse, demandez des devis.

L’interface publique : le lieu où les acheteurs industriels atterrissent, recherchent et se convertissent.

  • Contenu multilingue, avec chaque chaîne visible récupérée depuis la base de données cms_template_texts clé par <controller>/<action> + langue. Les éditeurs mettent à jour le contenu depuis l’administration sans déploiement.
  • Recherche en puissance d’Elasticsearch, avec filtrage sensible au type — les dimensions analysées des chaînes "2500 × 1200 mm" en plages numériques pour que les acheteurs puissent rechercher par taille.
  • URLs amicales pour le référencement/maschine/drehmaschine-2500/42 — générées à partir du nom de la machine avec normalisation des umlauts allemands (ä → ae, ß → ss). L’identifiant numérique suit toujours en queue pour que le routeur puisse résoudre un slug obsolète.
  • Flipbooks Yumpu PDF pour les catalogues téléchargeables.
  • Module Hausmesse pour l’enregistrement aux salons commerciaux avec accès sensible au rôle.
application/controller/maschineController.php
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 lignes, sans conteneur DI, sans pipeline de validation, sans pile middleware. Charge d’abord le contenu géré par le CMS (donc une panne de base de données sur les machines ne tue pas la page), tire la machine avec un repli gracieux, génère toujours les métadonnées SEO. La toute la page détail est rendue en deux tours de base de données.


Un mur de livres techniques usagés, un ouvert en brouillard doux.

36 contrôleurs · 18 modules · 348 modèles · 161 migrations SQL · 37 369 lignes de PHP

data.maschinen-stockert.de — admin & API

Le cockpit interne. Les employés du service commercial gèrent l'inventaire, le contenu, les emplois, les pages de l'équipe, les inscriptions aux salons commerciaux. Les développeurs et les intégrations appellent des API REST pour rechercher des machines, synchroniser les fabricants, générer des PDFs, interagir avec Ollama pour obtenir des descriptions d'IA des machines.

data.maschinen-stockert.de — administrateur & API

Section intitulée « data.maschinen-stockert.de — administrateur & API »

Les mêmes modules, trois fois plus de contrôleurs et de modèles — car les interfaces d’administration et les API nécessitent de nombreux points d’entrée.

  • Page-tree CMS: Les éditeurs construisent des pages à partir d’un modèle Smarty ; le plugin Parser analyse les espaces réservés {$identifier} dans le modèle et génère automatiquement l’interface d’administration des champs modifiables. Le modèle est la spécification du formulaire.
  • Contrôle d’accès basé sur les rôles (ACL) : chaque constructeur de contrôleur administrateur appelle $this->user = new User(); $this->acl = new Acl(); $this->acl->init(); $this->user->validate(); — trois lignes, c’est fait. Les ventes ont uniquement un accès en lecture seule pour l’inventaire ; les administrateurs peuvent éditer ; les partenaires voient uniquement leurs listes assignées.
  • Liste blanche de l’API publique : apiController permet la recherche par machine, la récupération des catégories, les informations d’équipe et les appels à Ollama AI sans authentification, puis nécessite une authentification pour tout le reste. La liste blanche est directement dans le constructeur — pas de bugs d’ordre des middlewares.
  • Indexeur Machineryscout : le module le plus lourd. Un trait de 2 200 lignes qui extrait les machines + attributs + images + documents à partir de MySQL via JSON_ARRAYAGG, normalise les types ("2500 x 1200"dimension_width: 2500.0, dimension_height: 1200.0), remplace les espaces réservés pour les images manquantes et envoie les lignes dans Elasticsearch.

Le modèle du parseur — génération automatique d’interfaces utilisateur de l’éditeur à partir d’un modèle

Section intitulée « Le modèle du parseur — génération automatique d’interfaces utilisateur de l’éditeur à partir d’un modèle »
application/controller/adminController.php
$parser = Parser::init();
$cmsEditable = $parser->parseSmartyTemplateByTemplateId($templateId);
View::assign([
'cmsEditable' => $cmsEditable,
'cmsTemplateTextForm'=> Cms::textsEditingForm('/admin/texts/create/text/new'),
]);

Ajoutez un nouveau modèle Smarty au système, l’éditeur reconnaît immédiatement quels espaces réservés sont modifiables. Aucune étape de “enregistrement des champs du formulaire”.


Les cinq différences ci-dessous sont tirées des bases de code ci-dessus. Chacune fait référence à son évidence sur la page Pourquoi Nibiru.

Ce que fait NibiruCe que Laravel/Symfony fait
Contenu de la pageChargé à partir de la base de données par <controller>/<action> par requête, géré par l’éditeur.Codé en dur dans Blade / fichier JSON de traduction ; déploiement pour modifier.
Composition des modules13 traits par module, sans injection de dépendances.Fournisseurs de services + conteneur IoC.
ORMSQL direct, MySQL JSON_ARRAYAGG, Pdo::fetchAll.Entités Eloquent / Doctrine + proxies de chargement paresseux.
Authentification3 lignes dans le constructeur du contrôleur.Pile de middlewares + classes de politique + portails.
ÉvénementsSplSubject + SplObserver de la bibliothèque standard PHP.Dispatcheur d’événements personnalisé + registre d’écouteurs + file d’attente.

Lisez le détail complet avec des références de code →


Maschinen Stockert est un site réel et générant des revenus qui vend de la machinerie dans 12 pays. Il a déployé 161 migrations SQL horodatées en production sans framework de migration, 74 000 lignes de PHP sur deux dépôts sans conteneur de service et 18 modules composés avec des traits au lieu d’héritage. L’équipe qui l’a construit et qui le gère est petite.

Voici la preuve.

Si vous déployez avec une petite équipe sur un budget serré et dans un environnement de production où les déploiements et les temps d’arrêt coûtent vraiment cher — c’est le point faible de Nibiru. Lisez le Démarrage rapide, puis revenez.