Estamos actualizando el sitio. Durante unos días es posible que veas fallos de diseño o de traducción. La documentación sigue disponible: si una página se ve mal, recárgala más tarde.

Inicio Laravel 10.x Respuestas HTTP

Respuestas HTTP

10.x 7 de mar. de 2026

#Creando respuestas

#Cadenas y arreglos

Todas las rutas y controladores deben devolver una respuesta que será enviada al navegador del usuario. Laravel ofrece varias formas de devolver respuestas. La respuesta más básica es devolver una cadena desde una ruta o controlador. El framework convertirá automáticamente la cadena en una respuesta HTTP completa:

Route::get('/', function () {
    return 'Hello World';
});

Además de devolver cadenas desde sus rutas y controladores, también puede devolver arreglos. El framework convertirá automáticamente el arreglo en una respuesta JSON:

Route::get('/', function () {
    return [1, 2, 3];
});
Примечание

¿Sabía que también puede devolver colecciones Eloquent desde sus rutas o controladores? Estas se convertirán automáticamente a JSON. ¡Pruébelo!

#Objetos de respuesta

Normalmente, no solo devolverá cadenas simples o arreglos desde las acciones de sus rutas. En su lugar, devolverá instancias completas de Illuminate\Http\Response o vistas.

Devolver una instancia completa de Response le permite personalizar el código de estado HTTP y los encabezados de la respuesta. Una instancia de Response hereda de la clase Symfony\Component\HttpFoundation\Response, que proporciona varios métodos para construir respuestas HTTP:

Route::get('/home', function () {
    return response('Hello World', 200)
                  ->header('Content-Type', 'text/plain');
});

#Modelos y colecciones Eloquent

También puede devolver modelos y colecciones de Eloquent ORM directamente desde sus rutas y controladores. Cuando lo haga, Laravel convertirá automáticamente los modelos y colecciones en respuestas JSON respetando los atributos ocultos del modelo:

use App\Models\User;

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

#Adjuntando encabezados a las respuestas

Tenga en cuenta que la mayoría de los métodos de respuesta son encadenables, lo que permite construir instancias de respuesta de forma fluida. Por ejemplo, puede usar el método header para agregar una serie de encabezados a la respuesta antes de enviarla al usuario:

return response($content)
            ->header('Content-Type', $type)
            ->header('X-Header-One', 'Header Value')
            ->header('X-Header-Two', 'Header Value');

O bien, puede usar el método withHeaders para especificar un arreglo de encabezados que se agregarán a la respuesta:

return response($content)
            ->withHeaders([
                'Content-Type' => $type,
                'X-Header-One' => 'Header Value',
                'X-Header-Two' => 'Header Value',
            ]);

#Middleware de control de caché

Laravel incluye un middleware cache.headers, que puede usarse para establecer rápidamente el encabezado Cache-Control para un grupo de rutas. Las directivas deben proporcionarse usando la versión en "snake case" de la directiva correspondiente de cache-control y deben separarse por punto y coma. Si etag está especificado en la lista de directivas, se establecerá automáticamente un hash MD5 del contenido de la respuesta como identificador ETag:

Route::middleware('cache.headers:public;max_age=2628000;etag')->group(function () {
    Route::get('/privacy', function () {
        // ...
    });

    Route::get('/terms', function () {
        // ...
    });
});

#Adjuntando cookies a las respuestas

Puede adjuntar una cookie a una instancia saliente de Illuminate\Http\Response usando el método cookie. Debe pasar el nombre, valor y el número de minutos que la cookie debe considerarse válida a este método:

return response('Hello World')->cookie(
    'name', 'value', $minutes
);

El método cookie también acepta algunos argumentos adicionales que se usan con menos frecuencia. Generalmente, estos argumentos tienen el mismo propósito y significado que los argumentos que se pasarían al método nativo de PHP setcookie:

return response('Hello World')->cookie(
    'name', 'value', $minutes, $path, $domain, $secure, $httpOnly
);

Si desea asegurarse de que una cookie se envíe con la respuesta saliente pero aún no tiene una instancia de esa respuesta, puede usar el facade Cookie para "enviar en cola" cookies para adjuntarlas a la respuesta cuando se envíe. El método queue acepta los argumentos necesarios para crear una instancia de cookie. Estas cookies se adjuntarán a la respuesta saliente antes de enviarla al navegador:

use Illuminate\Support\Facades\Cookie;

Cookie::queue('name', 'value', $minutes);

Si desea generar una instancia de Symfony\Component\HttpFoundation\Cookie que pueda adjuntarse a una instancia de respuesta más adelante, puede usar el helper global cookie. Esta cookie no se enviará al cliente a menos que se adjunte a una instancia de respuesta:

$cookie = cookie('name', 'value', $minutes);

return response('Hello World')->cookie($cookie);

#Expirando cookies anticipadamente

Puede eliminar una cookie expirándola mediante el método withoutCookie de una respuesta saliente:

return response('Hello World')->withoutCookie('name');

Si aún no tiene una instancia de la respuesta saliente, puede usar el método expire del facade Cookie para expirar una cookie:

Cookie::expire('name');

#Cookies y encriptación

Por defecto, todas las cookies generadas por Laravel están encriptadas y firmadas para que no puedan ser modificadas o leídas por el cliente. Si desea deshabilitar la encriptación para un subconjunto de cookies generadas por su aplicación, puede usar la propiedad $except del middleware App\Http\Middleware\EncryptCookies, que se encuentra en el directorio app/Http/Middleware:

/**
 * Los nombres de las cookies que no deben ser encriptadas.
 *
 * @var array
 */
protected $except = [
    'cookie_name',
];

#Redirecciones

Las respuestas de redirección son instancias de la clase Illuminate\Http\RedirectResponse y contienen los encabezados adecuados para redirigir al usuario a otra URL. Hay varias formas de generar una instancia de RedirectResponse. El método más simple es usar el helper global redirect:

Route::get('/dashboard', function () {
    return redirect('home/dashboard');
});

A veces puede desear redirigir al usuario a su ubicación anterior, como cuando un formulario enviado es inválido. Puede hacerlo usando la función helper global back. Dado que esta función utiliza la sesión, asegúrese de que la ruta que llama a la función back use el grupo de middleware web:

Route::post('/user/profile', function () {
    // Validar la solicitud...

    return back()->withInput();
});

#Redirigiendo a rutas nombradas

Cuando llama al helper redirect sin parámetros, se devuelve una instancia de Illuminate\Routing\Redirector, lo que le permite llamar a cualquier método en la instancia de Redirector. Por ejemplo, para generar una RedirectResponse a una ruta nombrada, puede usar el método route:

return redirect()->route('login');

Si su ruta tiene parámetros, puede pasarlos como segundo argumento al método route:

// Para una ruta con la siguiente URI: /profile/{id}

return redirect()->route('profile', ['id' => 1]);

#Población de parámetros mediante modelos Eloquent

Si está redirigiendo a una ruta con un parámetro "ID" que se está poblando desde un modelo Eloquent, puede pasar el modelo mismo. El ID se extraerá automáticamente:

// Para una ruta con la siguiente URI: /profile/{id}

return redirect()->route('profile', [$user]);

Si desea personalizar el valor que se coloca en el parámetro de la ruta, puede especificar la columna en la definición del parámetro de la ruta (/profile/{id:slug}) o puede sobrescribir el método getRouteKey en su modelo Eloquent:

/**
 * Obtener el valor de la clave de ruta del modelo.
 */
public function getRouteKey(): mixed
{
    return $this->slug;
}

#Redirigiendo a acciones de controladores

También puede generar redirecciones a acciones de controladores. Para hacerlo, pase el controlador y el nombre de la acción al método action:

use App\Http\Controllers\UserController;

return redirect()->action([UserController::class, 'index']);

Si la ruta de su controlador requiere parámetros, puede pasarlos como segundo argumento al método action:

return redirect()->action(
    [UserController::class, 'profile'], ['id' => 1]
);

#Redirigiendo a dominios externos

A veces puede necesitar redirigir a un dominio fuera de su aplicación. Puede hacerlo llamando al método away, que crea una RedirectResponse sin codificación, validación o verificación adicional de la URL:

return redirect()->away('https://www.google.com');

#Redirigiendo con datos flash en la sesión

Redirigir a una nueva URL y flashear datos a la sesión generalmente se hacen al mismo tiempo. Normalmente, esto se hace después de realizar una acción con éxito cuando se flashea un mensaje de éxito a la sesión. Para mayor comodidad, puede crear una instancia de RedirectResponse y flashear datos a la sesión en una sola cadena de métodos fluida:

Route::post('/user/profile', function () {
    // ...

    return redirect('dashboard')->with('status', '¡Perfil actualizado!');
});

Después de que el usuario es redirigido, puede mostrar el mensaje flasheado desde la sesión. Por ejemplo, usando la sintaxis Blade:

@if (session('status'))
    <div class="alert alert-success">
        {{ session('status') }}
    </div>
@endif

#Redirigiendo con datos de entrada

Puede usar el método withInput proporcionado por la instancia RedirectResponse para flashear los datos de entrada de la solicitud actual a la sesión antes de redirigir al usuario a una nueva ubicación. Esto se hace típicamente si el usuario ha encontrado un error de validación. Una vez que la entrada ha sido flasheada a la sesión, puede recuperarla fácilmente durante la siguiente solicitud para rellenar el formulario:

return back()->withInput();

#Otros tipos de respuesta

El helper response puede usarse para generar otros tipos de instancias de respuesta. Cuando se llama al helper response sin argumentos, se devuelve una implementación del contrato Illuminate\Contracts\Routing\ResponseFactory. Este contrato proporciona varios métodos útiles para generar respuestas.

#Respuestas de vistas

Si necesita control sobre el estado y los encabezados de la respuesta pero también necesita devolver una vista como contenido de la respuesta, debe usar el método view:

return response()
            ->view('hello', $data, 200)
            ->header('Content-Type', $type);

Por supuesto, si no necesita pasar un código de estado HTTP personalizado o encabezados personalizados, puede usar la función helper global view.

#Respuestas JSON

El método json establecerá automáticamente el encabezado Content-Type a application/json, además de convertir el arreglo dado a JSON usando la función PHP json_encode:

return response()->json([
    'name' => 'Abigail',
    'state' => 'CA',
]);

Si desea crear una respuesta JSONP, puede usar el método json en combinación con el método withCallback:

return response()
            ->json(['name' => 'Abigail', 'state' => 'CA'])
            ->withCallback($request->input('callback'));

#Descargas de archivos

El método download puede usarse para generar una respuesta que fuerza al navegador del usuario a descargar el archivo en la ruta dada. El método download acepta un nombre de archivo como segundo argumento, que determinará el nombre que verá el usuario al descargar el archivo. Finalmente, puede pasar un arreglo de encabezados HTTP como tercer argumento:

return response()->download($pathToFile);

return response()->download($pathToFile, $name, $headers);
Внимание

Symfony HttpFoundation, que gestiona las descargas de archivos, requiere que el archivo que se descarga tenga un nombre ASCII.

#Descargas transmitidas (streamed)

A veces puede desear convertir la respuesta de cadena de una operación dada en una respuesta descargable sin tener que escribir el contenido de la operación en disco. Puede usar el método streamDownload en este escenario. Este método acepta un callback, nombre de archivo y un arreglo opcional de encabezados como argumentos:

use App\Services\GitHub;

return response()->streamDownload(function () {
    echo GitHub::api('repo')
                ->contents()
                ->readme('laravel', 'laravel')['contents'];
}, 'laravel-readme.md');

#Respuestas de archivos

El método file puede usarse para mostrar un archivo, como una imagen o PDF, directamente en el navegador del usuario en lugar de iniciar una descarga. Este método acepta la ruta absoluta al archivo como primer argumento y un arreglo de encabezados como segundo argumento:

return response()->file($pathToFile);

return response()->file($pathToFile, $headers);

#Macros de respuesta

Si desea definir una respuesta personalizada que pueda reutilizar en varias de sus rutas y controladores, puede usar el método macro en el facade Response. Normalmente, debe llamar a este método desde el método boot de uno de los service providers de su aplicación, como el service provider App\Providers\AppServiceProvider:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Response;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Inicializar cualquier servicio de la aplicación.
     */
    public function boot(): void
    {
        Response::macro('caps', function (string $value) {
            return Response::make(strtoupper($value));
        });
    }
}

La función macro acepta un nombre como primer argumento y un closure como segundo argumento. El closure de la macro se ejecutará al llamar al nombre de la macro desde una implementación de ResponseFactory o el helper response:

return response()->caps('foo');