Un controller o una route devono restituire una qualche response al browser dell’utente.
Laravel offre un meccanismo semplice per restituire response di vari formati: stringhe, array, viste, redirect, JSON e altro.
Restituendo direttamente un modello Eloquent o una collezione, viene convertito automaticamente in JSON. È un pattern molto usato per creare API velocemente.
Con la funzione route() puoi indicare la destinazione tramite il nome della route senza scrivere direttamente l’URL.
Poiché non serve modificare il codice se l’URL cambia, la best practice è sfruttare le route con nome.
// Assegna un nome alla routeRoute::get('/posts', [PostController::class, 'index'])->name('posts.index');Route::get('/posts/{post}', [PostController::class, 'show'])->name('posts.show');
// Redirect verso la route con nomereturn redirect()->route('posts.index');// Passando parametri di routereturn redirect()->route('posts.show', ['post' => $post->id]);
<?phpnamespace 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 { // Crea con i dati validati (dopo una form request o $request->validate()) $user = User::create($request->validated()); return response()->json($user, 201); }}
Anche restituendo semplicemente un array o un modello Eloquent ottieni una response JSON, ma con response()->json() puoi controllare codice e header nel dettaglio.
<?phpnamespace App\Http\Controllers;use App\Models\Post;use Illuminate\Http\RedirectResponse;use Illuminate\Http\Request;use Illuminate\View\View;class PostController extends Controller{ // Elenco: restituisce una vista public function index(): View { $posts = Post::latest()->get(); return view('posts.index', ['posts' => $posts]); } // Form di creazione: restituisce una vista public function create(): View { return view('posts.create'); } // Salvataggio: restituisce un redirect public function store(Request $request): RedirectResponse { // Crea con dati validati (se usi una form request) $post = Post::create($request->validated()); return redirect() ->route('posts.show', ['post' => $post->id]) ->with('success', 'Post creato.'); } // Dettaglio: restituisce una vista public function show(Post $post): View { return view('posts.show', ['post' => $post]); } // Eliminazione: restituisce un redirect public function destroy(Post $post): RedirectResponse { $post->delete(); return redirect() ->route('posts.index') ->with('success', 'Post eliminato.'); }}
Nelle app web l’uso di View e RedirectResponse è fondamentale. Il pattern tipico è restituire View per le azioni di visualizzazione e RedirectResponse per le azioni di modifica (creazione, aggiornamento, eliminazione) dopo l’elaborazione.