Passer au contenu principal

Qu’est-ce qu’une réponse

Un contrôleur ou une route doit renvoyer une réponse au navigateur. Laravel propose des mécanismes simples pour retourner divers formats : chaîne, tableau, vue, redirection, JSON, etc.

Réponses de base

Retourner une chaîne

La réponse la plus simple est une chaîne. Laravel la convertit automatiquement en réponse HTTP appropriée.
Route::get('/', function () {
    return 'Hello World';
});

Retourner un tableau

Un tableau retourné est automatiquement converti en JSON.
Route::get('/users', function () {
    return [
        ['id' => 1, 'name' => 'Tanaka'],
        ['id' => 2, 'name' => 'Suzuki'],
    ];
});
Retourner directement un modèle ou une collection Eloquent produit également une conversion automatique en JSON. Un pattern très utilisé pour créer rapidement des API.

Retourner un modèle Eloquent

use App\Models\User;

Route::get('/user/{user}', function (User $user) {
    return $user;
});

L’objet Response

Le helper response() permet de retourner une réponse détaillée avec code HTTP et en-têtes personnalisés.
Route::get('/home', function () {
    return response('Hello World', 200)
        ->header('Content-Type', 'text/plain');
});
Le premier argument est le corps de la réponse, le second le code HTTP.

Codes HTTP courants

CodeSignification
200OK (succès)
201Created (ressource créée)
204No Content
301Moved Permanently (redirection permanente)
302Found (redirection temporaire)
404Not Found
422Unprocessable Entity (erreur de validation)
500Internal Server Error

Réponse de vue

Pour afficher un template Blade depuis un contrôleur, utilisez view(). C’est la réponse la plus courante dans une application web.
<?php

namespace App\Http\Controllers;

use Illuminate\View\View;

class HomeController extends Controller
{
    public function index(): View
    {
        $users = [
            ['name' => 'Tanaka', 'email' => '[email protected]'],
            ['name' => 'Suzuki', 'email' => '[email protected]'],
        ];

        return view('users.index', ['users' => $users]);
    }
}
Le premier argument est le nom de la vue, le second un tableau de données pour la vue.
Typer le retour avec Illuminate\View\View clarifie l’intention du code.

Contrôler les détails avec response()->view()

Pour spécifier aussi le code HTTP et les en-têtes, utilisez response()->view().
return response()
    ->view('errors.404', ['message' => 'Page introuvable'], 404);

Redirections

Redirection de base

Le helper redirect() retourne une réponse de redirection. Souvent utilisé après l’envoi d’un formulaire.
use Illuminate\Http\RedirectResponse;

Route::get('/old-page', function (): RedirectResponse {
    return redirect('/new-page');
});
Exemple en contrôleur :
<?php

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;

class PostController extends Controller
{
    public function store(Request $request): RedirectResponse
    {
        // Sauvegarde de la publication...

        return redirect('/posts');
    }
}

Redirection vers une route nommée

route() évite d’écrire l’URL directement. Pour ne pas devoir modifier le code si l’URL change, préférez les routes nommées.
// Nommer les routes
Route::get('/posts', [PostController::class, 'index'])->name('posts.index');
Route::get('/posts/{post}', [PostController::class, 'show'])->name('posts.show');
// Redirection vers une route nommée
return redirect()->route('posts.index');

// Avec des paramètres de route
return redirect()->route('posts.show', ['post' => $post->id]);

Retour à la page précédente

back() renvoie vers la page précédente. Souvent utilisé lors d’un échec de validation.
return back();

// En conservant l'input
return back()->withInput();

Redirection avec message flash

with() ajoute un message en session lors de la redirection. Idéal pour confirmer un envoi de formulaire.
return redirect('/posts')->with('success', 'Publication créée.');
Affichez le message dans Blade :
@if (session('success'))
    <div class="alert alert-success">
        {{ session('success') }}
    </div>
@endif

Réponses JSON

Pour une API, retournez du JSON avec response()->json(). L’en-tête Content-Type: application/json est ajouté automatiquement.
use Illuminate\Http\JsonResponse;

Route::get('/api/users', function (): JsonResponse {
    $users = [
        ['id' => 1, 'name' => 'Tanaka'],
        ['id' => 2, 'name' => 'Suzuki'],
    ];

    return response()->json($users);
});
Vous pouvez spécifier le code HTTP.
return response()->json(['message' => 'Créé'], 201);
Exemple en contrôleur :
<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function index(): JsonResponse
    {
        $users = User::all();

        return response()->json($users);
    }

    public function store(Request $request): JsonResponse
    {
        // Création avec les données validées (form request ou $request->validate())
        $user = User::create($request->validated());

        return response()->json($user, 201);
    }
}
Retourner simplement un tableau ou un modèle Eloquent produit du JSON, mais response()->json() offre un contrôle fin sur code HTTP et en-têtes.

En-têtes de réponse

header() ajoute un en-tête HTTP.
return response('Hello World')
    ->header('Content-Type', 'text/plain')
    ->header('X-Custom-Header', 'MyValue');
Utilisez withHeaders() pour en ajouter plusieurs.
return response('Hello World')
    ->withHeaders([
        'Content-Type' => 'text/plain',
        'X-Custom-Header' => 'MyValue',
        'Cache-Control' => 'no-cache',
    ]);

Exemple : quelle réponse choisir dans un contrôleur

Exemple récapitulatif adaptant la réponse à l’usage.
1

Définition des routes

use App\Http\Controllers\PostController;

Route::get('/posts', [PostController::class, 'index'])->name('posts.index');
Route::get('/posts/create', [PostController::class, 'create'])->name('posts.create');
Route::post('/posts', [PostController::class, 'store'])->name('posts.store');
Route::get('/posts/{post}', [PostController::class, 'show'])->name('posts.show');
Route::delete('/posts/{post}', [PostController::class, 'destroy'])->name('posts.destroy');
2

Implémentation du contrôleur

<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;

class PostController extends Controller
{
    // Liste : retourne une vue
    public function index(): View
    {
        $posts = Post::latest()->get();

        return view('posts.index', ['posts' => $posts]);
    }

    // Formulaire de création : retourne une vue
    public function create(): View
    {
        return view('posts.create');
    }

    // Enregistrement : retourne une redirection
    public function store(Request $request): RedirectResponse
    {
        // Création avec les données validées (via un form request)
        $post = Post::create($request->validated());

        return redirect()
            ->route('posts.show', ['post' => $post->id])
            ->with('success', 'Publication créée.');
    }

    // Détail : retourne une vue
    public function show(Post $post): View
    {
        return view('posts.show', ['post' => $post]);
    }

    // Suppression : retourne une redirection
    public function destroy(Post $post): RedirectResponse
    {
        $post->delete();

        return redirect()
            ->route('posts.index')
            ->with('success', 'Publication supprimée.');
    }
}
Dans une application web, le choix se fait généralement entre View et RedirectResponse. Les actions d’affichage renvoient une View, tandis que les actions de modification (création, mise à jour, suppression) renvoient une RedirectResponse après le traitement.

Prochaines étapes

Validation

Vérifiez les données d’entrée avec la validation avant de retourner une réponse.
Dernière modification le 13 juillet 2026