Glisser

Laravel Nova : créer un CRUD en 5 minutes (ressources et champs)

Laravel Nova : un CRUD en 5 minutes (partie 3)

Écrit par : Thibault Chazottes

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 :

  1. deux migrations + deux modèles avec relations ;
  2. deux ressources Nova avec fields() ;
  3. 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).