Démarrage rapide

De zéro à un CRUD fonctionnel en 5 minutes

Prérequis : Un projet River avec Alluvia installé et une base de données configurée.

1. Lancer le générateur

Le générateur crée automatiquement tous les fichiers nécessaires. Passez le nom de la table (pluriel) suivi des champs au format nom:type :

php bin/dt_generate articles title:string content:text published:bool author_id:int

Le générateur affiche les fichiers créés et la ligne à ajouter dans roads.php :

✓ app/Controllers/Admin/Articles_ctrl.php
✓ app/views/admin/articles/index.php
✓ app/views/admin/articles/edit.php
✓ app/views/admin/articles/_dt.php
✓ app/views/admin/articles/_row.php
✓ app/views/admin/articles/_row_edit.php
✓ app/views/admin/articles/_modal_create.php
✓ app/views/admin/articles/_modal_edit.php
✓ app/views/admin/articles/_modal_del.php
✓ migrations/2024_01_01_articles.php

→ Ajoutez dans roads.php :
  $router->scan_controller(\App\Controllers\Admin\Articles_ctrl::class);

2. Ajouter la route dans roads.php

Copiez-collez la ligne affichée par le générateur :

<?php
use River\Router;

return function(Router $router) {
    // ...
    $router->scan_controller(\App\Controllers\Admin\Articles_ctrl::class);
};
scan_controller() détecte automatiquement les attributs #[Route] et #[Route_prefix] dans le controller et enregistre toutes les routes (index, search, ptt, restore, del, bulk, create, edit).

3. (Optionnel) Exécuter la migration

Si la table n'existe pas encore :

php bin/migrate

4. Visiter l'URL

Le préfixe de route est admin/{table} par défaut. Pour l'exemple ci-dessus :

http://votre-site.local/admin/articles

Vous avez immédiatement un CRUD complet avec :

Pagination
Tri par colonne
Recherche
Onglets actif/corbeille
Création modale
Édition inline
Corbeille / Restauration
Suppression définitive
Actions bulk

5. Personnaliser

Le code généré est un point de départ à modifier. Les fichiers importants :

FichierQuoi modifier
Articles_ctrl.php Ajouter du middleware, des validations spécifiques, de la logique métier, des labels personnalisés (label_ptt(), label_del()…)
_dt.php Configurer les onglets, la barre de recherche, la pagination, les colonnes tri
_row.php Affichage des colonnes dans la table (format, badges, liens…)
_row_edit.php Champs du formulaire d'édition inline (Inline_input, Inline_select…)
_modal_create.php / _modal_edit.php Formulaire des modales de création et édition
index.php Mise en page de la page principale (fenêtre, titre, toolbar)

Structure d'un controller généré

Le controller concret étend Dt_controller et implémente seulement dt_page() :

#[Route_prefix(prefix: 'admin/articles', middleware: Role_middleware::class . ':admin')]
class Articles_ctrl extends Dt_controller
{
    protected string $table    = 'articles';
    protected string $entity   = 'article';
    protected string $road     = 'admin/articles/';
    protected string $view_dir = 'admin/articles';

    #[Route('GET', '', name: 'admin.articles')]
    public function dt_page(): Response
    {
        return $this->render('admin/articles/index', [
            'dt' => $this->dt,
        ]);
    }
}
Conseil : Regardez app/Controllers/Admin/Users_ctrl.php comme référence d'implémentation complète. C'est le controller de référence, le plus complet et le mieux documenté.