Response

Response

Creating Responses

Responses

Strings and Arrays

Todas las rutas y controladores deben devolver una respuesta para ser enviada de vuelta al navegador del usuario. Laravel proporciona varias formas diferentes 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 tus rutas y controladores, también puedes devolver arrays. El framework convertirá automáticamente el array en una respuesta JSON:

Route::get('/', function () {
    return [1, 2, 3];
});

ℹ️ ¿Sabías que también puedes devolver colecciones Eloquent desde tus rutas o controladores? Se convertirán automáticamente a JSON.

Response Objects

Por lo general, no se limitará a devolver simples cadenas o matrices de sus acciones de ruta. En su lugar, devolverá instancias o vistas Illuminate\Http\Response

Devolver una instancia de Response permite personalizar el status code HTTP y las headers de la respuesta. Una instancia de Response hereda de la clase Symfony\Component\HttpFoundation\Response, que proporciona una variedad de métodos para construir respuestas HTTP:

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

Eloquent Models and Collections

También puedes devolver modelos y colecciones de Eloquent ORM directamente desde tus rutas y controladores. Cuando lo hagas, Laravel convertirá automáticamente los modelos y colecciones en respuestas JSON respetando los hidden attributes del modelo :

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

Attaching Headers to Responses

Ten en cuenta que la mayoría de los métodos de respuesta son encadenables, lo que permite la construcción fluida de instancias de respuesta. Por ejemplo, puedes utilizar el método header para añadir una serie de headers a la respuesta antes de enviarla de vuelta al usuario:

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

También puede utilizar el método withHeaders para especificar un array de headers que se añadirán a la respuesta:

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

Cache Control Middleware

Laravel incluye un middleware cache.headers, que puede utilizarse para establecer rápidamente el header Cache-Control para un grupo de rutas. Las directivas deben proporcionarse usando el equivalente “snake case” de la directiva cache-control correspondiente y deben separarse por punto y coma. Si se especifica etag 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 () {
        // ...
    });
});

Attaching Cookies to Responses

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

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

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

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

Si desea asegurarse de que se envía una cookie en la respuesta pero aún no tiene una instancia de esa respuesta, puede utilizar la facade Cookie para “poner en cola” cookies para añadirlas a la respuesta cuando se envíe. El método de queue acepta los argumentos necesarios para crear una instancia de cookie. Estas cookies se adjuntarán a la respuesta antes de que se envíe al navegador:

use Illuminate\Support\Facades\Cookie;
 
Cookie::queue('name', 'value', $minutes);

Si deseas generar una instancia de Symfony\Component\HttpFoundation\Cookie que puede ser adjuntada a una instancia de respuesta en un momento posterior, puedes utilizar el helper global cookie . Esta cookie no se devolverá al cliente a menos que se adjunte a una instancia de respuesta:

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

Expiring Cookies Early

Puede eliminar una cookie expirándola a través del método withoutCookie de una respuesta:

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

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

**Cookie::expire('name');**

Cookies and Encryption

Por defecto, gracias al middleware Illuminate\Cookie\Middleware\EncryptCookies, todas las cookies generadas por Laravel son encriptadas y firmadas para que no puedan ser modificadas o leídas por el cliente. Si quieres deshabilitar el cifrado para un subconjunto de cookies generadas por tu aplicación, puedes utilizar el método encryptCookies en el fichero bootstrap/app.php de tu aplicación:

->withMiddleware(function (Middleware $middleware) {
    $middleware->encryptCookies(except: [
        'cookie_name',
    ]);
})

Redirects

Las respuestas de redirección son instancias de la clase Illuminate\Http\RedirectResponse, y contienen las cabeceras adecuadas necesarias para redirigir al usuario a otra URL. Hay varias maneras de generar una instancia RedirectResponse. El método más sencillo es utilizar el helper global reditect:

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

Es posible que desee redirigir al usuario a su ubicación anterior, como cuando un formulario enviado no es válido. Puede hacerlo utilizando la función helper back. Dado que esta función utiliza la sesión, asegurate que la ruta que llama a la función back está utilizando web como middleware group:

Route::post('/user/profile', function () {
    // Validate the request...
 
    return back()->withInput();
});

Redirecting to Named Routes

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

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

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

// For a route with the following URI: /profile/{id}
 
return redirect()->route('profile', ['id' => 1]);

Populating Parameters via Eloquent Models

Si está redirigiendo a una ruta con un parámetro “ID” que se está rellenando desde un modelo de Eloquent, puede pasar el propio modelo. El ID se extraerá automáticamente:

// For a route with the following URI: /profile/{id}
 
return redirect()->route('profile', [$user]);

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

/**
 * Get the value of the model's route key.
 */
public function getRouteKey(): mixed
{
    return $this->slug;
}

Redirecting to Controller Actions

También puede generar redirects a controller actions. Para ello, pasa 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]
);

Redirecting to External Domains

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

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

Redirecting With Flashed Session Data

La redirección a una nueva URL y flashing data to the session suelen realizarse al mismo tiempo. Normalmente, esto se hace después de realizar con éxito una acción cuando se flashea un mensaje de éxito en la sesión. Para mayor comodidad, puede crear una instancia de RedirectResponse y flashear los datos en la sesión usando un único encadenamiento de metodos:

Route::post('/user/profile', function () {
    // ...
 
    return redirect('/dashboard')->with('status', 'Profile updated!');
});

Después de redirigir al usuario, puede mostrar el mensaje fleasheado en la sesión. Por ejemplo, utilizando la sintaxis de Blade:

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

Redirecting With Input

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

return back()->withInput();

Other Response Types

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

View Responses

Si necesita controlar el estado y los headers de la response, pero también necesita devolver una vista como contenido de la respuesta, debes utilizar el método view:

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

Si no necesita pasar un código de estado HTTP personalizado o headers personalizadas, puede utilizar la función helper global view.

JSON Responses

El método json establecerá automáticamente el header Content-Type a application/json, así como, convertir el array dado a JSON usando la función PHP json_encode:

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

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

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

File Downloads

El método download puede utilizarse para generar una respuesta que obligue al navegador del usuario a descargar el archivo en la ruta dada. El método download acepta un nombre de fichero como segundo argumento del método, que determinará el nombre de fichero que verá el usuario que descargue el fichero. Por último, puede pasar un array de headers HTTP como tercer argumento al método:

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 de archivo ASCII.

File Responses

El método file puede utilizarse para mostrar un archivo, como una imagen o un 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 array de headers como segundo argumento:

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

Streamed Responses

Al transmitir los datos al cliente a medida que se generan, se puede reducir significativamente el uso de memoria y mejorar el rendimiento, especialmente en el caso de respuestas muy grandes. Las respuestas en streaming permiten al cliente empezar a procesar los datos antes de que el servidor haya terminado de enviarlos:

function streamedContent(): Generator {
    yield 'Hello, ';
    yield 'World!';
}
 
Route::get('/stream', function () {
    return response()->stream(function (): void {
        foreach (streamedContent() as $chunk) {
            echo $chunk;
            ob_flush();
            flush();
            sleep(2); // Simulate delay between chunks...
        }
    }, 200, ['X-Accel-Buffering' => 'no']);
});

Internamente, Laravel utiliza la funcionalidad de búfer de salida de PHP. Como puedes ver en el ejemplo anterior, debes utilizar las funciones ob_flush y flush para enviar el contenido almacenado en el buffer al cliente.

Streamed JSON Responses

Si necesita transmitir datos JSON de forma incremental, puede utilizar el método streamJson. Este método es especialmente útil para grandes conjuntos de datos que necesitan ser enviados progresivamente al navegador en un formato que pueda ser fácilmente parseados por JavaScript:

use App\Models\User;
 
Route::get('/users.json', function () {
    return response()->streamJson([
        'users' => User::cursor(),
    ]);
});

Streamed Downloads

A veces puede que desees convertir la cadena de respuesta de una operación en una respuesta descargable sin tener que escribir el contenido de la operación en el disco. En este caso, puede utilizar el método streamDownload Este método acepta como argumentos un callback, un nombre de archivo y un array opcional de headers:

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

Response Macros

Si deseas definir una respuesta personalizada que puedas reutilizar en varias de tus rutas y controladores, puede utilizar el método macro de la facade Response. Normalmente, deberías llamar a este método desde el método boot de uno de tus service providers, como App\Providers\AppServiceProvider:

<?php
 
namespace App\Providers;
 
use Illuminate\Support\Facades\Response;
use Illuminate\Support\ServiceProvider;
 
class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     */
    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 una closure como segundo argumento. El closure de la macro se ejecutará cuando se llame al nombre de la macro desde una implementación de ResponseFactory o el helper response:

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