[Video] Lập trình Laravel - Truyền dữ liệu từ Controller qua View - Ví dụ hiển thị danh sách sinh viên trong Laravel Phần 3
Lập trình Laravel - Truyền dữ liệu từ Controller qua View - Ví dụ hiển thị danh sách sinh viên trong Laravel Phần 3
Mở bài
Việc xây dựng giao diện hiển thị dữ liệu là nhiệm vụ cốt lõi của bất kỳ ứng dụng web nào. Trong hệ sinh thái Laravel, việc truyền dữ liệu từ Controller qua View trong Laravel là kỹ năng nền tảng giúp bạn biến những con số, bản ghi hay logic xử lý thành giao diện thân thiện với người dùng. Ở phần 3 này, chúng ta sẽ tập trung vào ví dụ thực tế: hiển thị danh sách sinh viên — một module nhỏ nhưng đầy đủ các khái niệm cần thiết như route, controller, model, migration, Eloquent ORM, Blade template, pagination, search và xử lý lỗi.
Bài viết hướng dẫn từng bước — từ thiết lập database, tạo model & migration, viết controller lấy dữ liệu với Eloquent, truyền dữ liệu sang view rồi render bằng Blade — kèm theo các kỹ thuật nâng cao như route model binding, resource controller, query scope, caching, và tối ưu hiển thị. Mục tiêu là giúp bạn không chỉ biết cách truyền dữ liệu từ Controller qua View trong Laravel mà còn hiểu khi nào nên dùng phương pháp nào để ứng dụng vừa hiệu quả vừa dễ bảo trì.
Chuẩn bị: cấu hình dự án và mô hình dữ liệu sinh viên
Trước khi xuống tay code, bạn cần chuẩn bị môi trường và cấu trúc dữ liệu cho module quản lý sinh viên.
1. Tạo dự án và cấu hình database
-
Tạo project Laravel mới (nếu chưa có):
-
Cấu hình file
.env:
-
Chạy
php artisan migratesau khi tạo migration.
2. Tạo model và migration cho Student
Trong migration (database/migrations/xxxx_create_students_table.php), định nghĩa các cột cơ bản:
Chạy:
Khi đã có database và bảng students, bạn sẵn sàng thực hành cách truyền dữ liệu từ Controller qua View trong Laravel để hiển thị danh sách sinh viên.
Định nghĩa route và resource controller: điểm khởi đầu của luồng dữ liệu
Để tổ chức mã nguồn theo chuẩn RESTful, Laravel cung cấp Route::resource() giúp sinh ra đầy đủ route cho CRUD. Đây là bước đầu để điều hướng request đến controller và từ đó truyền dữ liệu tới view.
Khai báo route
Mở routes/web.php và thêm:
Route::resource('students', ...) sẽ tạo 7 route chuẩn: index, create, store, show, edit, update, destroy. Route students.index (GET /students) là nơi bạn sẽ lấy dữ liệu và truyền sang view hiển thị danh sách.
Tạo controller resource
Tạo controller:
Trong StudentController, phương thức index() sẽ chịu trách nhiệm lấy danh sách sinh viên bằng Eloquent và trả view. Đây chính là nơi thực hiện hành động truyền dữ liệu từ Controller qua View trong Laravel.
Lấy dữ liệu bằng Eloquent và truyền sang View
Eloquent là ORM mạnh mẽ của Laravel, giúp bạn thao tác database bằng model một cách trực quan. Ở đây, ta sẽ dùng Eloquent để query danh sách sinh viên và truyền kết quả sang view.
Ví dụ phương thức index trong StudentController
Giải thích:
-
Student::query()tạo builder để thêm điều kiện linh hoạt. -
paginate(10)giúp chia trang; kết quả trả về sẽ là collection trang hóa. -
withQueryString()giữ các tham số search/sort khi chuyển trang. -
compact()là cách ngắn gọn để truyền dữ liệu từ Controller qua View trong Laravel.
Lợi ích
-
View nhận data dạng
$studentsđã có thông tin phân trang. -
Controller giữ logic xử lý, view chỉ lo hiển thị — tôn trọng nguyên tắc separation of concerns.
Thiết kế Blade view để hiển thị danh sách sinh viên
Sau khi Controller truyền $students sang view, nhiệm vụ view (Blade template) là render bảng dữ liệu, xử lý pagination và hiển thị các control tìm kiếm/sort.
File resources/views/students/index.blade.php
Điều bạn cần lưu ý:
-
Blade directive
@forelsehữu dụng khi collection có thể rỗng. -
{{ $students->links() }}hiển thị pagination controls. -
Các link sắp xếp dùng
request()->all()để giữ filter hiện tại.
Đây là một minh chứng trực quan cho việc truyền dữ liệu từ Controller qua View trong Laravel: controller cung cấp $students, view sử dụng để render giao diện.
Tìm kiếm, sắp xếp và query scope: mở rộng khả năng hiển thị
Để module linh hoạt hơn, ta nên tách logic tìm kiếm/sort vào model hoặc scope. Điều này làm controller gọn hơn và tái sử dụng dễ dàng.
Thêm query scope trong model Student
Trong app/Models/Student.php:
Sử dụng scope trong controller
Lợi ích:
-
Tách concerns: model chịu trách nhiệm phần query đặc thù.
-
Dễ test: bạn có thể test scope độc lập.
-
Giúp việc truyền dữ liệu từ Controller qua View trong Laravel trở nên rõ ràng hơn bởi controller chỉ orchestration.
Route model binding và named routes: tối ưu cú pháp và bảo mật
Laravel hỗ trợ route model binding tự động, rất tiện cho các route show, edit, update, destroy.
Ví dụ route và controller edit
Route resource đã tự động khai báo /students/{student}/edit. Trong controller:
Khi dùng route model binding, bạn tránh phải gọi Student::findOrFail($id) — code ngắn gọn và an toàn hơn.
Named routes
Sử dụng route('students.index'), route('students.edit', $student) thay vì hardcode URL để dễ refactor và tránh lỗi khi đổi cấu trúc route.
Phân trang, caching và tối ưu hiệu suất
Danh sách có thể lớn, vì vậy pagination và caching là cần thiết.
Pagination
Sử dụng paginate(10) trên query và {{ $students->links() }} trong view giúp hiển thị từng trang, giảm tải memory.
Cache
Lưu kết quả query phổ biến:
Cache giúp giảm truy vấn DB cho các trang phổ biến, nhưng cần invalidate khi có cập nhật (store, update, destroy).
Indexing DB
Đảm bảo cột tìm kiếm như name, email có index để tăng tốc LIKE queries hoặc dùng fulltext nếu cần.
Validation, mass assignment và an toàn dữ liệu
Khi truyền dữ liệu từ view về controller (store/update), cần validate và tránh mass assignment nguy hiểm.
Validation
Trong store() / update():
Mass assignment
Trong Student model, khai báo $fillable:
Tránh dùng $guarded = [] nếu bạn không kiểm soát input.
XSS protection
Blade {{ }} tự escape dữ liệu. Nếu muốn render HTML an toàn, dùng @{!! $var !!} chỉ khi bạn chắc chắn nội dung đã được sanitize.
UX nâng cao: AJAX, live search và các cải thiện giao diện
Để trải nghiệm người dùng mượt mà, bạn có thể:
-
Thêm AJAX cho delete/edit để không reload toàn trang.
-
Implement live search (typeahead) bằng fetch/Axios gọi API route trả JSON.
-
Dùng Blade components cho bảng, pagination controls, alert messages.
-
Support CSV export/import để quản lý danh sách lớn.
Những cải tiến này vẫn dựa trên cơ chế truyền dữ liệu từ Controller qua View trong Laravel: controller có thể trả JSON cho frontend JS hoặc view cho render server-side.
Kiểm thử cho module danh sách sinh viên
Viết test đảm bảo module hoạt động ổn định:
Feature test cho index
Test tìm kiếm và phân trang
Tạo dữ liệu cụ thể và assert rằng filter trả về đúng bản ghi.
Testing giúp đảm bảo rằng việc truyền dữ liệu từ Controller qua View trong Laravel không bị phá vỡ khi refactor.
Tổng kết và best practices
Bài học chính:
-
Luồng chuẩn: Route → Controller → Model (Eloquent) → View (Blade).
-
Controller là nơi bạn lấy dữ liệu và truyền dữ liệu từ Controller qua View trong Laravel; view chỉ hiển thị.
-
Dùng
Route::resource()và route model binding để giữ code sạch, an toàn. -
Tách query logic vào model scope để tái sử dụng và dễ kiểm thử.
-
Áp dụng pagination, cache và indexing để tối ưu hiệu suất.
-
Luôn validate input, sử dụng
$fillablevà escape output để bảo mật.
Danh sách tóm tắt các thủ thuật:
-
Dùng
compact()/with()/mảng để truyền dữ liệu sang view. -
Sử dụng query scope cho tìm kiếm.
-
Cache các trang phổ biến.
-
Viết unit & feature tests cho tất cả các luồng.
-
Dùng Blade components để tái sử dụng UI.
Kết luận
Trong phần 3 này, bạn đã đi sâu vào ví dụ hiển thị danh sách sinh viên để thực hành cách truyền dữ liệu từ Controller qua View trong Laravel — từ việc định nghĩa route, dùng resource controller, truy vấn Eloquent, đến thiết kế Blade view, xử lý tìm kiếm, sắp xếp, phân trang và tối ưu hiệu suất. Đây là một module mẫu mà bạn có thể mở rộng thành chức năng quản trị thực thụ: thêm create/edit/delete, phân quyền, export/import và tích hợp frontend hiện đại.
Hãy áp dụng các best practices đã nêu: tách logic, dùng query scope, validate input, cache khi cần và luôn viết test. Khi bạn thành thục việc truyền dữ liệu từ Controller qua View trong Laravel, việc xây dựng các tính năng phức tạp hơn — như dashboards, báo cáo, hay API cho SPA — sẽ trở nên đơn giản và đáng tin cậy hơn. Bắt tay thực hành ngay: cài project, seed dữ liệu, viết controller và view — rồi thử từng biến thể (AJAX, API, export) để nắm thật chắc kỹ năng này. Chúc bạn phát triển module quản lý sinh viên chuyên nghiệp và mở rộng ứng dụng Laravel hiệu quả!