L'objet Response
Un contrôleur Forge retourne toujours une réponse HTTP explicite. Il n'y a pas de sortie implicite ni de magie cachée.
Cycle HTML — via View
Request → Router → Controller → View → Response HTML
return BaseController.render(
"welcome/response_example.html", # ← la View
context={"cle": "valeur"},
request=request,
)
# → HTTP 200 OK + Content-Type: text/html
Redirection
return BaseController.redirect("/welcome")
# → HTTP 302 Found + Location: /welcome
Cycle JSON — sans View
Request → Router → Controller → Response JSON
from core.http.response import JSONResponse
return JSONResponse({"status": "ok", "version": "1.0"})
# → HTTP 200 OK + Content-Type: application/json
# ↑ pas de View : le contrôleur construit directement la réponse
Réponse avec code HTTP personnalisé
return BaseController.render(
"errors/404.html",
request=request,
status=404,
)
# → HTTP 404 Not Found + page d'erreur personnalisée
Principe Forge : le contrôleur retourne toujours une valeur. Il n'écrit jamais directement dans le flux de sortie. Forge transmet la réponse au serveur HTTP qui se charge de l'envoi.