Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Bài 15: Response trong Laravel 8

Tiếp tục với series, bài này mình sẽ giới thiệu với mọi người về response trong Laravel.

Tất cả các route hay controller trong Laravel đều phải trả về một response. Laravel có cung cấp sẵn một Response class để hỗ trợ chúng ta trả về các loại response data một cách đơn giản nhất.

1. Response Data.

Mặc định, Khi một route, controller trả về giá trị là chuỗi thì Laravel sẽ tự động convert nó về dạng một HTTP response.

VD1:

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

Kết quả:

Response trong Laravel

Ngoài ra nếu bạn trả về một mảng thì laravel cũng sẽ tự convert nó về dạng một JSON response.

VD2:

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

Kết quả:

Response trong Laravel

Tuy nhiên, trong thực tế chúng ta lại cần trả về response với các header, status khác nhau. Lúc này bạn có thể sử dụng Response (Illuminate\Http\Response) của Laravel. Đồng thời Laravel cũng có đưa Response class vào helper. Nên chúng ta hoàn toàn có thể sử dụng hàmresponse() trong helper thay cho Response class để code được ngắn gọn hơn.

VD3: Đối với VD1 thay vì để laravel tự động convert, chúng ta có thể viết dưới dạng.

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

Trong đó: 200 là http code trả về.

VD4: Tương đương với trường hợp VD2, chúng ta có thể viết dưới dạng.

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

Để đưa thêm header vào trong response các bạn có thể sử dụng phương thức header với cú pháp:

header($headerName, $headerContent);

Trong đó:

  • $headerName là tên của header bạn muốn thêm.
  • $headerContent là giá trị của header đó.

VD5:

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

Hoặc bạn có thể viết ngắn ngọn hơn với phương thức withHeaders.

VD6:

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

Nếu bạn muốn thêm cookie vào response bạn có thể sử dụng phương thức cookie với cú pháp truyền vào tương tự như đối với hàm setcookie.

VD7:

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

Nếu bạn muốn xóa một cookie nào đó trong response bạn có thể sử dụng phương thức withoutCookie.

VD8:

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

2. Redirect Response.

Đối với trường hợp bạn muốn trả về một redirect response, Laravel cũng có sẵn cho bạn một class Illuminate\Http\RedirectResponse để làm điều đó. Đồng thời Laravel cũng đã đưa nó vào helper để tiện cho việc sử dụng. Chúng ta có thể sử dụng helper redirect thay cho class trên.

VD9: Redirect về URL /home/dashboard khi người dùng vào URL /dashboard.

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

Trong trường hợp bạn muốn redirect về URL user vừa truy cập trước đó, bạn có thể sử dụng hàm back.

VD10:

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

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

Bạn cũng có thể ridirect đến một route nào đó bằng cách sử dụng phương thức route.

VD11:

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

Nếu như bạn muốn redirect sang một domain khác, bạn có thể sử dụng phương thức away.

VD12: redirect đến google

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

3. File Response.

Nếu bạn muốn response về một file bạn có thể sử dụng phương thức file với cú pháp:

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

// Hoặc

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

Trong đó:

  • $pathToFile là path đến file bạn muốn trả về.
  • $name là tên của file bạn muốn trả về.
  • $headers là các header bạn muốn trả về kèm theo. Cú pháp giống phương thức header ở trên.

Ngoài ra bạn cũng có thể response về một file hiển thị trên trình duyệt được như PDF. Bằng cách sử dụng phương thức file với cú pháp:

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

// hoặc

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

Trong đó:

  • $pathToFile là path đến file bạn muốn trả về.
  • $name là tên của file bạn muốn trả về.

Đôi khi bạn muốn trả về một nội dung nào đó có thể download được, nhưng lại không muốn ghi chúng vào ổ trước khi download. Bạn có thể sử dụng method streamDownload để trả về một stream data.

VD13:

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

4. Lời kết.

Về phần response mình cũng chỉ giới thiệu với mọi người những case phổ biến được thôi. Ở các bài sau có phần nào động đến response mình sẽ giải thích thêm.

Đăng ký nhận tin.

Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!

Vũ Thanh Tài

About author
The best way to learn is to share
Xem tất cả bài đăng

1 Comments

bài viết đơn giản dễ hiểu, cám ơn anh ạ

Mit

3 năm trước

Bình luận

Captcha