Laravel Nova : créer un CRUD en 5 minutes (ressources et champs)
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).