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 :
| Fichier | Quoi 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é.