---
title: "En production"
description: "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."
---

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.

---

<div class="showcase-plate">
  <img src="/img/showcase-tpms.png" alt="Une machine CNC industrielle sur un chantier à l'heure dorée." />
  <div class="showcase-plate__body">
    <p class="showcase-plate__meta">10 contrôleurs · 18 modules · 150 modèles · 36,289 lignes de PHP</p>
    <h3 class="showcase-plate__title">maschinen-stockert.de — catalogue public</h3>
    <p class="showcase-plate__desc">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.</p>
  </div>
</div>

## maschinen-stockert.de — catalogue public

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

### Ce qui est embarqué dedans

- **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.

### Une action représentative
```php
// 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.

---

<div class="showcase-plate">
  <img src="/img/showcase-thorax.png" alt="Un mur de livres techniques usagés, un ouvert en brouillard doux." />
  <div class="showcase-plate__body">
    <p class="showcase-plate__meta">36 contrôleurs · 18 modules · 348 modèles · 161 migrations SQL · 37 369 lignes de PHP</p>
    <h3 class="showcase-plate__title">data.maschinen-stockert.de — admin & API</h3>
    <p class="showcase-plate__desc">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.</p>
  </div>
</div>

## 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.

### Ce qu'il fait

- **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
```php
// 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".

---

## Ce qui est vraiment spécial, résumé

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](/en/why-nibiru/).

| | Ce que fait Nibiru | Ce que Laravel/Symfony fait |
|---|---|---|
| Contenu de la page | Chargé à 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 modules | 13 traits par module, sans injection de dépendances. | Fournisseurs de services + conteneur IoC. |
| ORM | SQL direct, MySQL `JSON_ARRAYAGG`, `Pdo::fetchAll`. | Entités Eloquent / Doctrine + proxies de chargement paresseux. |
| Authentification | 3 lignes dans le constructeur du contrôleur. | Pile de middlewares + classes de politique + portails. |
| Événements | `SplSubject` + `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 →](/fr/pourquoi-nibiru/)

---

## Ce qui a été nécessaire

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](/en/start/quick-start/), puis revenez.
