Los controladores y las rutas necesitan devolver alguna respuesta al navegador del usuario.
Laravel ofrece mecanismos sencillos para devolver diversos formatos: cadenas, arrays, vistas, redirecciones, JSON, etc.
Si devuelves un modelo Eloquent o una colección directamente, también se convierten automáticamente a JSON. Es un patrón muy usado para APIs sencillas.
Con route() puedes indicar el destino de la redirección por el nombre de la ruta, sin escribir la URL.
Aunque la URL cambie, no hay que modificar nada; usar rutas con nombre es una buena práctica.
// Da nombre a la rutaRoute::get('/posts', [PostController::class, 'index'])->name('posts.index');Route::get('/posts/{post}', [PostController::class, 'show'])->name('posts.show');
// Redirige a la ruta con nombrereturn redirect()->route('posts.index');// Con parámetrosreturn 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 { // Crear con los datos validados (tras usar form request o $request->validate()) $user = User::create($request->validated()); return response()->json($user, 201); }}
Devolver directamente un array o un modelo Eloquent también produce una respuesta JSON, pero response()->json() te da control fino sobre el código de estado y las cabeceras.
<?phpnamespace App\Http\Controllers;use App\Models\Post;use Illuminate\Http\RedirectResponse;use Illuminate\Http\Request;use Illuminate\View\View;class PostController extends Controller{ // Listar: devuelve una vista public function index(): View { $posts = Post::latest()->get(); return view('posts.index', ['posts' => $posts]); } // Formulario de creación: devuelve una vista public function create(): View { return view('posts.create'); } // Guardar: devuelve una redirección public function store(Request $request): RedirectResponse { // Crear con datos validados (si usas una form request) $post = Post::create($request->validated()); return redirect() ->route('posts.show', ['post' => $post->id]) ->with('success', 'Post creado.'); } // Detalle: devuelve una vista public function show(Post $post): View { return view('posts.show', ['post' => $post]); } // Eliminar: devuelve una redirección public function destroy(Post $post): RedirectResponse { $post->delete(); return redirect() ->route('posts.index') ->with('success', 'Post eliminado.'); }}
En una aplicación web, la elección básica es entre View y RedirectResponse. Las acciones de visualización devuelven View; las de cambio (crear/actualizar/eliminar) tras procesar devuelven RedirectResponse. Es el patrón habitual.