Drag

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).