Sau khi đã học xong Eloquent ORM và các Relationship, chúng ta sẽ chuyển sang phần Form.
Trong mọi ứng dụng web, người dùng luôn gửi dữ liệu lên máy chủ thông qua biểu mẫu (Form), URL hoặc API. Laravel cung cấp lớp Request để tiếp nhận và xử lý những dữ liệu này một cách đơn giản và an toàn.
Ở bài này, chúng ta sẽ tìm hiểu cách lấy dữ liệu từ Request trước khi chuyển sang Validation ở bài tiếp theo.
Request là gì?
Request là đối tượng đại diện cho một yêu cầu HTTP gửi đến Laravel.
Ví dụ người dùng:
Mở một trang web.
Gửi biểu mẫu thêm bài viết.
Nhấn nút tìm kiếm.
Cập nhật thông tin cá nhân.
Tất cả dữ liệu đều được Laravel đóng gói trong đối tượng Request.
Import Request
Trong Controller:
use Illuminate\Http\Request;
Ví dụ:
use Illuminate\Http\Request;
class PostController extends Controller
{
public function store(Request $request)
{
}
}
Laravel sẽ tự động truyền đối tượng Request vào phương thức.
Tạo Form thêm Post
Ví dụ trong Blade:
<form action="{{ route('posts.store') }}" method="POST">
@csrf
<input
type="text"
name="title"
placeholder="Tiêu đề">
<textarea
name="content"
placeholder="Nội dung"></textarea>
<select name="category_id">
@foreach($categories as $category)
<option value="{{ $category->id }}">
{{ $category->name }}
</option>
@endforeach
</select>
<button type="submit">
Lưu bài viết
</button>
</form>
Danh sách Category chính là dữ liệu đã được tạo bằng Seeder ở các bài trước.
Lấy toàn bộ dữ liệu
Trong Controller:
public function store(Request $request)
{
dd($request->all());
}
Ví dụ kết quả:
[
"title" => "Laravel 12",
"content" => "...",
"category_id" => 2,
]
Lấy một trường
$title = $request->input('title');
Hoặc:
$title = $request->title;
Hai cách đều hợp lệ.
Giá trị mặc định
Nếu trường không tồn tại:
$status = $request->input(
'status',
0
);
Nếu không gửi status, Laravel sẽ trả về 0.
Kiểm tra dữ liệu
if ($request->has('title')) {
echo "Có tiêu đề";
}
Kiểm tra nhiều trường:
$request->has([
'title',
'content'
]);
Chỉ lấy một số trường
$data = $request->only([
'title',
'content'
]);
Hoặc:
$data = $request->except([
'_token'
]);
Điều này rất hữu ích khi lưu dữ liệu vào Model.
Tạo Post
Ví dụ:
Post::create([
'title' => $request->title,
'content' => $request->content,
'category_id' => $request->category_id,
'user_id' => 1,
]);
Trong dự án có đăng nhập, user_id thường lấy từ tài khoản đang đăng nhập. Ở giai đoạn hiện tại của khóa học, chúng ta tạm gán một giá trị cố định để tập trung vào cách xử lý Request.
Tìm kiếm Post
Request không chỉ dùng cho Form.
Ví dụ URL:
/posts?keyword=Laravel
Controller:
public function index(Request $request)
{
$keyword = $request->keyword;
$posts = Post::where(
'title',
'like',
"%{$keyword}%"
)->get();
return view(
'posts.index',
compact('posts')
);
}
Người dùng nhập từ khóa, Laravel sẽ lấy dữ liệu từ URL và tìm kiếm bài viết.
Lấy Category
Ví dụ:
/posts?category=2
Controller:
$category = $request->category;
$posts = Post::where(
'category_id',
$category
)->get();
Nhờ vậy có thể lọc bài viết theo danh mục đã tạo bằng Seeder.
Request và Relationship
Giả sử người dùng chọn nhiều Tag.
Blade:
<select
name="tags[]"
multiple>
@foreach($tags as $tag)
<option value="{{ $tag->id }}">
{{ $tag->name }}
</option>
@endforeach
</select>
Controller:
$tagIds = $request->tags;
Sau khi tạo Post:
$post->tags()->sync(
$tagIds
);
Đây chính là cách kết hợp Request với Relationship Many To Many đã học ở bài trước.
Request và Profile
Ví dụ cập nhật Profile:
$profile->update([
'phone' => $request->phone,
'address' => $request->address,
]);
Các trường phone và address thuộc bảng profiles mà chúng ta đã tạo trong phần Relationship.
Một số phương thức thường dùng
| Phương thức | Ý nghĩa |
|---|---|
| all() | Lấy toàn bộ dữ liệu |
| input() | Lấy một trường |
| has() | Kiểm tra trường tồn tại |
| only() | Chỉ lấy các trường được chỉ định |
| except() | Loại bỏ một số trường |
| method() | Lấy phương thức HTTP |
| isMethod() | Kiểm tra phương thức HTTP |
Ví dụ:
if ($request->isMethod('post')) {
echo 'Đây là POST';
}
Tổng kết
Trong bài này chúng ta đã học:
Request là gì.
Lấy dữ liệu từ Form.
Lấy dữ liệu từ URL.
all().input().has().only().except().Kết hợp Request với Eloquent và Relationship.
Request là bước đầu tiên trong quá trình xử lý dữ liệu người dùng trước khi lưu vào cơ sở dữ liệu.
Bài tập
Tạo Form thêm Post gồm tiêu đề, nội dung và Category.
Hiển thị toàn bộ dữ liệu bằng
dd($request->all()).Lưu Post mới vào cơ sở dữ liệu.
Viết chức năng tìm kiếm Post theo tiêu đề bằng Request.
Lọc danh sách Post theo Category.
Cho phép chọn nhiều Tag và liên kết với Post bằng
sync().
Bài tiếp theo
Ở bài sau, chúng ta sẽ tìm hiểu Validation, cách kiểm tra dữ liệu đầu vào để đảm bảo người dùng nhập đúng định dạng trước khi lưu vào cơ sở dữ liệu.



Không có nhận xét nào:
Đăng nhận xét