Inertia.js 2.3 : Le support natif de Precognition pour la validation en temps réel

L
Laravel Actu
1 min

Fini les packages supplémentaires pour la validation en temps réel ! Inertia.js 2.3 intègre Laravel Precognition directement dans le composant <Form> et le helper useForm(). Vos règles de validation backend sont désormais exploitables côté frontend sans duplication de code.

Qu’est-ce que Laravel Precognition ?

Laravel Precognition permet d’anticiper le résultat d’une requête HTTP future. Concrètement, lorsqu’une requête « précognitive » arrive, Laravel exécute les middlewares et valide les Form Requests — sans jamais exécuter le code du contrôleur.

Le principal cas d’usage : offrir une validation en direct sur vos formulaires frontend, en réutilisant exactement les mêmes règles définies côté serveur.

Avant Inertia 2.3, il fallait installer un package séparé (laravel-precognition-vue ou laravel-precognition-react). Cette nouvelle version supprime cette contrainte.

Configuration côté Laravel

Pour activer Precognition sur une route, ajoutez le middleware HandlePrecognitiveRequests :

<?php

use App\Http\Requests\StoreUserRequest;
use Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests;

// Activation de Precognition sur la route
Route::post('/users', function (StoreUserRequest $request) {
    // Logique de création de l'utilisateur
})->middleware([HandlePrecognitiveRequests::class]);

La Form Request contient vos règles de validation classiques :

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreUserRequest extends FormRequest
{
    /**
     * Règles de validation pour la création d'utilisateur
     */
    public function rules(): array
    {
        return [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'email', 'unique:users,email'],
            'password' => ['required', 'min:8', 'confirmed'],
        ];
    }
}

Utilisation avec le composant Form (Vue)

Le composant `

` d’Inertia 2.3 expose directement les méthodes Precognition via son slot par défaut : « `vue

{{ errors.name }}

{{ errors.email }}

Validation en cours…


Le slot expose quatre propriétés essentielles :
- `errors` : objet contenant les messages d'erreur
- `invalid(field)` : vérifie si un champ est invalide
- `validate(field)` : déclenche la validation d'un champ
- `validating` : indique si une validation est en cours

## Utilisation avec useForm() et withPrecognition()

Pour les formulaires plus complexes, le helper `useForm()` s'enrichit de la méthode `withPrecognition()` :

```javascript
import { useForm } from '@inertiajs/vue3'

// Activation de Precognition sur le formulaire
const form = useForm({
  name: '',
  email: '',
  password: '',
}).withPrecognition('post', '/users')

// Validation d'un champ spécifique
const validateField = (field) => {
  form.validate(field)
}

// Soumission du formulaire
const submit = () => {
  form.submit()
}

L’appel à withPrecognition() prend deux paramètres : la méthode HTTP et l’URL cible. Ensuite, form.validate() déclenche une requête précognitive vers votre backend.

Méthodes valid() et invalid()

Ces deux méthodes permettent un affichage conditionnel précis de l’état de validation :

<script setup>
import { useForm } from '@inertiajs/vue3'

const form = useForm({
  email: '',
}).withPrecognition('post', '/users')
</script>

<template>

<div>
    <input 
      v-model="form.email" 
      @blur="form.validate('email')" 
    />

    <!-- Indicateur visuel de validation réussie -->
    <span v-if="form.valid('email')" class="text-green-500">✓</span>

    <!-- Indicateur visuel d'erreur -->
    <span v-if="form.invalid('email')" class="text-red-500">
      {{ form.errors.email }}
    </span>
  </div>
</template>

Un champ n’apparaît comme valide ou invalide qu’après modification et réception de la réponse de validation.

Personnalisation des règles côté backend

Vous pouvez adapter les règles selon le type de requête avec isPrecognitive() :

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rules\Password;

class StoreUserRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'password' => [
                'required',
                // Validation légère pour Precognition, complète pour la soumission
                $this->isPrecognitive()
                    ? Password::min(8)
                    : Password::min(8)->uncompromised(),
            ],
        ];
    }
}

Cette approche évite des appels API lourds (comme la vérification de mot de passe compromis) lors de la validation en temps réel.

Points d’attention

  • Debounce automatique : les requêtes de validation sont automatiquement « debouncées ». Configurez le délai avec form.setValidationTimeout(3000)
  • Fichiers : par défaut, Precognition n’envoie pas les fichiers lors de la validation. Adaptez vos règles avec isPrecognitive()
  • Side-effects : vérifiez que vos middlewares ne comptabilisent pas les requêtes précognitives (analytics, rate limiting…)
  • Compatibilité : cette intégration native nécessite Inertia 2.3+. Les versions antérieures doivent utiliser les packages laravel-precognition-vue ou laravel-precognition-react

Tester les requêtes précognitives

Laravel fournit des helpers de test dédiés :

<?php

use App\Models\User;

it('valide le formulaire avec precognition', function () {
    $response = $this->withPrecognition()
        ->post('/users', [
            'name' => 'John Doe',
            'email' => 'john@example.com',
        ]);

    // Vérifie que la validation précognitive a réussi
    $response->assertSuccessfulPrecognition();

    // Confirme qu'aucun utilisateur n'a été créé
    expect(User::count())->toBe(0);
});

assertSuccessfulPrecognition() vérifie que la requête a passé la validation sans déclencher le code du contrôleur.

Résumé

Inertia.js 2.3 simplifie radicalement la validation de formulaires. Plus besoin de packages supplémentaires ni de duplication des règles. Le composant `

` et `useForm().withPrecognition()` offrent une API claire et cohérente. Les développeurs Laravel profitent enfin d’une expérience de validation unifiée entre backend et frontend. ## Ressources * [Documentation Inertia.js – Forms](https://inertiajs.com/docs/v2/the-basics/forms#precognition) * [Documentation Laravel Precognition](https://laravel.com/docs/12.x/precognition) * [Release GitHub v2.3.0](https://github.com/inertiajs/inertia/releases/tag/v2.3.0) * [Pull Request #2684 – useForm() Precognition](https://github.com/inertiajs/inertia/pull/2684) * [Pull Request #2700 – Form Component Precognition](https://github.com/inertiajs/inertia/pull/2700)

À propos de Laravel Actu

Développeur passionné par Laravel et son écosystème.

Voir tous les articles
Partager :

Ne manquez aucune actualité Laravel

Recevez les meilleurs articles et tutoriels directement dans votre boîte mail.

Pas de spam. Désinscription possible à tout moment.