Skip to content

HTTP Responses

Tạo Responses (Creating Responses)

Strings và Arrays

Cách cơ bản nhất — trả string hoặc array từ route/controller:

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

// Array tự động chuyển thành JSON
Route::get('/', function () {
    return [1, 2, 3];
});

Response Objects

Trả full Illuminate\Http\Response instance để tùy chỉnh status code và headers:

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

Eloquent Models và Collections

Trả trực tiếp Eloquent models/collections — Laravel tự động chuyển thành JSON:

php
use App\Models\User;

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

Gắn Headers vào Responses

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

// Hoặc dùng withHeaders
return response($content)
    ->withHeaders([
        'Content-Type' => $type,
        'X-Header-One' => 'Header Value',
    ]);

Gắn Cookies vào Responses

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

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

Cookies và Encryption

Mặc định, tất cả cookies của Laravel được mã hóa và ký. Để tắt mã hóa cho một số cookies:

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

Redirects

Redirect responses là instances của Illuminate\Http\RedirectResponse:

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

// Redirect về trang trước
Route::post('/user/profile', function () {
    // Validate request...
    return back()->withInput();
});

Redirect đến Named Routes

php
return redirect()->route('profile');

// Với parameters
return redirect()->route('profile', ['id' => 1]);

Redirect đến Controller Actions

php
use App\Http\Controllers\UserController;

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

Redirect đến External Domains

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

Redirect kèm Flashed Session Data

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

Truy cập flash data trong Blade:

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

Các kiểu Response khác (Other Response Types)

View Responses

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

JSON Responses

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

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

File Downloads

php
return response()->download($pathToFile);
return response()->download($pathToFile, $name, $headers);

// Xóa file sau khi download
return response()->download($pathToFile)->deleteFileAfterSend();

File Responses

Hiển thị file (PDF, ảnh) trực tiếp trong browser:

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

Streamed Responses

Streaming data đến client khi đang tạo, giảm memory usage:

php
Route::get('/stream', function () {
    return response()->stream(function (): void {
        foreach (['developer', 'admin'] as $string) {
            echo $string;
            ob_flush();
            flush();
            sleep(2);
        }
    }, 200, ['X-Accel-Buffering' => 'no']);
});

Hoặc dùng Generator:

php
Route::post('/chat', function () {
    return response()->stream(function (): Generator {
        $stream = OpenAI::client()->chat()->createStreamed(...);

        foreach ($stream as $response) {
            yield $response->choices[0];
        }
    });
});

Streamed JSON Responses

Stream dữ liệu JSON lớn:

php
return response()->streamJson([
    'users' => User::cursor()->map(function (User $user) {
        return [
            'name' => $user->name,
            'email' => $user->email,
        ];
    }),
]);

Event Streams (SSE)

php
return response()->eventStream(function (): Generator {
    $stream = OpenAI::client()->chat()->createStreamed(...);

    foreach ($stream as $response) {
        yield $response->choices[0]->delta->content;
    }
});

Streamed Downloads

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

Response Macros

Định nghĩa response tùy chỉnh tái sử dụng bằng macro method trong AppServiceProvider:

php
<?php

namespace App\Providers;

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

class AppServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        Response::macro('caps', function (string $value) {
            return Response::make(strtoupper($value));
        });
    }
}

Sử dụng macro:

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