Nova est installé, place au concret. En moins de 5 minutes, on peut transformer deux modèles Eloquent (Customer et Order) en CRUD complets : liste, détail, création, édition, suppression, recherche et tri.
Le secret ? Les ressources Nova : une classe par modèle, une méthode fields() qui déclare les champs, et Nova génère toute l’interface. C’est ce qui m’a convaincu dès la première démo en 2018.
Dans cet article, on reprend l’exemple clients / commandes avec relation hasMany / belongsTo, comme dans la vidéo de la playlist.
Un CRUD Nova en 5 minutes : le principe
Après la présentation et l’installation, on passe à l’essentiel : transformer un modèle Laravel en interface d’administration sans écrire routes, contrôleurs ni vues.
En moins de 5 minutes, j’ai ajouté deux entités dans Nova :
- Customers (clients) ;
- Orders (commandes).
Résultat : liste des données, vue détail, formulaire de création/édition, suppression, recherche, le tout fonctionnel.
Référence : Resources : documentation Laravel Nova.
Modèles Laravel : le point de départ classique
Rien de spécifique à Nova ici, migrations et modèles Eloquent habituels.
Tables
customers, nom, email, société, statut, etc. ;orders, liées à un client.
Relations
// App\Models\Customer
public function orders()
{
return $this->hasMany(Order::class);
}
// App\Models\Order
public function customer()
{
return $this->belongsTo(Customer::class);
}
Sans ressource Nova, ces modèles ne produisent aucune interface admin. C’est là que Nova intervient.
Modèle vs ressource : ne pas confondre
| Laravel | Nova |
|---|---|
Modèle Eloquent (Customer, Order) |
Ressource (Customer, Order dans app/Nova/) |
Étend Illuminate\Database\Eloquent\Model |
Étend Laravel\Nova\Resource |
| Données et logique métier | Interface d’administration |
Comme vos modèles héritent de Model, vos ressources Nova héritent de Resource : la classe mère de toutes les ressources.
Par défaut, Nova installe déjà une ressource User. Vous en ajoutez une par modèle à administrer :
app/Nova/
├── Customer.php
├── Order.php
└── User.php
La ressource Customer : ~30 lignes pour un CRUD complet
Une ressource Nova définit notamment :
- le modèle lié (
Customer::class) ; - les labels singulier / pluriel (
Client/Clients) ; - la méthode
fields(): le cœur de la vidéo.
Déclarer les champs
Nova propose un système de fields (champs). On liste ce qu’on veut afficher :
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\HasMany;
public function fields(NovaRequest $request): array
{
return [
ID::make()->sortable(),
Text::make('Name'),
Text::make('Email'),
Text::make('Phone'),
Text::make('Company'),
Text::make('Status'),
HasMany::make('Orders'),
];
}
En déclarant ces champs, Nova génère automatiquement :
- la liste (index) avec colonnes ;
- la vue détail ;
- les formulaires création et édition ;
- la recherche sur les champs texte ;
- la relation HasMany vers les commandes.
C’est « bête et méchant » : un type de champ par colonne, texte, select, relation, etc.
Contrôler où un champ apparaît
Chaque field accepte des modificateurs de visibilité :
Text::make('Name')->hideFromIndex(),
On peut masquer un champ de l’index tout en le gardant en détail ou en création. Variantes courantes :
hideFromIndex(), pas dans la liste ;hideFromDetail(), pas en fiche ;hideWhenCreating()/hideWhenUpdating(), pas dans les formulaires.
Vous pilotez quoi afficher où sans toucher aux vues.
Validation : les règles Laravel habituelles
Les champs Nova acceptent les règles de validation Laravel :
Text::make('Email')->rules('required', 'email', 'max:255'),
Même syntaxe qu’ailleurs dans l’écosystème, pas de surprise.
La ressource Order : même principe
Pour Order, la structure est identique : méthode fields(), champs listés un par un.
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\Number;
use Laravel\Nova\Fields\Text;
public function fields(NovaRequest $request): array
{
return [
ID::make()->sortable(),
BelongsTo::make('Customer'),
Text::make('Status')->sortable(),
Number::make('Total'),
];
}
sortable() : tri sans code supplémentaire
Ajoutez ->sortable() sur un champ, Nova active le tri par colonne dans la liste. Pas de route custom, pas de contrôleur : c’est généré automatiquement.
Exemple : Status sortable → clic sur l’en-tête de colonne pour trier par statut.
Champs disponibles et communauté
La documentation Nova : Fields liste tous les types natifs :
- texte, textarea, markdown, code ;
- nombre, devise, pourcentage ;
- date, datetime ;
- select, boolean, toggle ;
- image, fichier ;
- relations :
BelongsTo,HasMany,BelongsToMany, etc.
C’est largement suffisant pour la plupart des projets. La communauté propose aussi des champs custom si besoin.
Champs dépendants
Nova permet des champs conditionnels : par exemple, choisir d’abord une catégorie avant de lister les produits associés dans un select. Utile pour les formulaires métier plus complexes, on approfondira dans la suite de la playlist.
Pourquoi Nova change la donne
Récapitulons ce qui a pris 5 minutes :
- deux migrations + deux modèles avec relations ;
- deux ressources Nova avec
fields(); - deux CRUD complets, recherche et tri inclus.
Sans Nova, il aurait fallu coder routes, contrôleurs, vues Blade, validation, pagination, filtres… Des jours de travail répétitif.
Avec Nova : une ressource par modèle, lister les champs : et c’est fonctionnel.
Vidéo : CRUD clients et commandes en pratique
FAQ rapide (SEO & technique)
Comment créer une ressource Nova ?
php artisan nova:resource Customer, puis compléter fields() et lier le modèle.
Faut-il une ressource par modèle ?
Oui, pour chaque entité que vous voulez administrer dans Nova.
Comment afficher une relation ?
BelongsTo::make('Customer'), HasMany::make('Orders'), etc.
Comment masquer un champ de la liste ?
->hideFromIndex() sur le field concerné.
Le tri par colonne est-il automatique ?
Oui, avec ->sortable() sur le champ.
Conclusion
Ressource + fields() : c’est le cœur de Laravel Nova. En quelques dizaines de lignes, vous obtenez un back-office propre, recherchable et triable, sur autant de modèles que nécessaire.
Suite de la série : Laravel Nova : filtres et métriques (stats du dashboard).