Drag

Laravel Nova : les actions (traitements en masse sur les ressources)

Laravel Nova : les actions (partie 5)

Écrit par : Thibault Chazottes

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 dans fields() (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 garder app/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 dans handle() 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).