Laravel Nova : les actions (traitements en masse sur les ressources)
CRUD, filtres et métriques : le back-office est déjà solide. Il manque souvent une dernière brique : agir sur plusieurs enregistrements d’un coup — changer un statut, exporter en CSV, marquer comme payé…
Les actions Nova permettent de sélectionner des lignes (ou toute une page filtrée) et d’exécuter un traitement groupé. Deux méthodes à coder : handle() pour la logique, fields() pour les options — comme marquer dix commandes « en attente » en un clic.
Les actions Nova : pourquoi c’est indispensable
Vous avez des clients et des commandes en ressources Nova (partie 3). Vous filtrez, vous cherchez, vous consultez les stats (partie 4).
Cas réel : toutes les commandes depuis le 1er janvier doivent passer en « en attente » ou « payé ». Modifier une par une dans le CRUD, c’est répétitif.
Nova propose les actions : cochez 4 lignes → un menu apparaît → « Marquer comme payé » → c’est fait en une seconde.
Référence : Actions — documentation Laravel Nova.
Le principe en deux méthodes
Chaque action est une classe dans app/Nova/Actions/ :
| Méthode | Rôle |
|---|---|
handle() |
Ce que vous faites sur les modèles sélectionnés |
fields() |
Champs optionnels affichés avant l’exécution (select, texte…) |
Action simple sans champ : MarkOrderAsPaid
public function handle(ActionFields $fields, Collection $models)
{
foreach ($models as $order) {
$order->update(['status' => OrderStatus::Paid]);
}
}
public function fields(NovaRequest $request): array
{
return []; // pas de formulaire
}
handle() reçoit :
$fields— valeurs saisies dansfields()(vide ici) ;$models— collection des enregistrements sélectionnés (ex. 3 commandes cochées).
Pour de gros volumes (1000+ lignes), préférez un
whereIn+ update massif plutôt qu’une boucle — ici on illustre le mécanisme.
Action avec choix : export ou statut
L’export n’est pas magique : vous codez la génération CSV, JSON ou XML. Nova fournit l’UI de sélection.
Dans fields(), un Select laisse l’utilisateur choisir le format :
Select::make('Format', 'format')
->options([
'csv' => 'CSV',
'json' => 'JSON',
'xml' => 'XML',
])
->rules('required'),
Dans handle(), vous lisez $fields->format et générez le fichier correspondant.
Créer une action : UpdateCustomerStatus
Générer la classe
php artisan nova:action UpdateCustomerStatus
Fichier créé : app/Nova/Actions/UpdateCustomerStatus.php.
Avec beaucoup d’actions, organisez par sous-dossiers (
Actions/Customer/,Actions/Order/) pour garderapp/Nova/Actions/lisible.
Définir fields() — choix du statut
use Laravel\Nova\Fields\Select;
public function fields(NovaRequest $request): array
{
return [
Select::make('Statut', 'status')
->options(CustomerStatus::labels()) // ex. prospect, actif, perdu
->displayUsingLabels()
->rules('required')
->default(CustomerStatus::Prospect),
];
}
Statut— label affiché ;status— clé utilisée danshandle()via$fields->status.
Définir handle() — mise à jour en masse
public function handle(ActionFields $fields, Collection $models)
{
foreach ($models as $customer) {
$customer->update([
'status' => $fields->status,
]);
}
}
Brancher sur la ressource
Dans app/Nova/Customer.php :
public function actions(NovaRequest $request): array
{
return [
new UpdateCustomerStatus,
new MarkOrderAsPaid, // sur Order, etc.
];
}
Sans cette ligne dans actions(), l’action n’apparaît pas — même si la classe existe.
Rechargez l’index : sélectionnez un ou plusieurs clients → le menu Actions propose « Update Customer Status ».
Sélection, filtres et « tout sélectionner »
Nova gère plusieurs scénarios :
- Quelques lignes cochées manuellement ;
- Toute la page (25 par 25) ;
- Tous les résultats filtrés — ex. « clients avec commandes » + action sur l’ensemble.
L’action s’applique aux ressources concernées par le filtre actif, pas à toute la base aveuglément. Filtres + actions + recherche : tout est cohérent sans code Ajax custom.
showInline() : action sur la ligne
Par défaut, les actions apparaissent après sélection multiple. Avec showInline() (ou l’équivalent selon la version Nova), l’action est accessible directement sur chaque ligne — pratique quand le client traite les dossiers un par un plutôt qu’en masse.
public function showInline()
{
return true;
}
Options avancées
Nova propose encore :
- Actions destructives — message d’avertissement rouge (« attention, irréversible ») ;
- Téléchargement de fichier — retourner une réponse download depuis
handle(); - Redirection après l’action vers une autre page ;
- Messages de confirmation personnalisés.
L’affinage dépend du cas métier ; le socle reste handle() + fields().
Back-office complet : le tableau de bord idéal client
Avec les épisodes précédents + les actions, vous couvrez ce qu’attend un back-office classique :
| Brique | Épisode |
|---|---|
| CRUD (ressources, champs) | Partie 3 |
| Filtres et métriques | Partie 4 |
| Actions en masse | Partie 5 |
Liste, recherche, stats, filtres cumulables, traitements groupés — sans recoder l’UI à chaque projet.
Vidéo : actions en pratique
FAQ rapide (SEO & technique)
Comment créer une action Nova ?
php artisan nova:action NomAction — puis handle(), fields(), et enregistrement dans actions() de la ressource.
Où brancher une action ?
Méthode actions() sur la ressource concernée (Customer, Order…).
Les actions respectent-elles les filtres actifs ?
Oui — vous pouvez agir sur la page courante ou sur tous les résultats filtrés.
L’export CSV est-il natif ?
L’UI oui ; la génération du fichier, c’est votre code dans handle().
Comment proposer un choix avant l’action ?
Déclarez des champs dans fields() (Select, Text, etc.) et lisez-les dans handle().
Conclusion
Les actions Nova ferment la boucle du back-office : sélection, options via fields(), traitement dans handle() — statuts en masse, exports, workflows métier.
Simple, prévisible, intégré aux filtres : encore une raison de ne pas recoder un admin from scratch.
Suite de la série : Laravel Nova : rechercher dans la DB (recherche globale et par ressource).