Response trong Laravel
Trong hướng dẫn này chúng ta đi tìm hiểu về Response trong Laravel 8 (Các giá trị trả về của route hay contronller trong Laravel)
Sau khi đi tìm hiểu về route và controller thì ta đã biết rằng 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.
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.
Ví dụ
Route::get('/', function () {
return 'Hello World';
});
Kết quả:
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.
Ví dụ
Route::get('/', function () {
return [1, 2, 3];
});
Kết quả:
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.
Ví dụ
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.
Ví dụ
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:
Ví dụ
header($headerName, $headerContent);
Trong đó:
$headerName
là tên của header bạn muốn thêm.$headerContent
là giá trị của header đó.
Ví dụ
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
.
Ví dụ
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.
Ví dụ
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
.
Ví dụ
return response('Hello World')->withoutCookie('name');
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
.
Ví dụ
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.
Ví dụ
Route::post('/user/profile', function () {
// Validate the request...
return back()->withInput();
});
Bạn cũng có thể redirect đến một route nào đó bằng cách sử dụng phương thức route
.
Ví dụ
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
Ví dụ
return redirect()->away('https://www.google.com');
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:
Ví dụ
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:
Ví dụ
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.
Ví dụ
return response()->streamDownload(function () {
echo GitHub::api('repo')
->contents()
->readme('laravel', 'laravel')['contents'];
}, 'laravel-readme.md');
Lời kết.
Trên đây là một số trường hợp phổ biến của response, trong các bài tiếp khi gặp đến chúng ta sẽ lại nó tiếp về nó.