📌 Chủ đề: The Basics
Làm chủ các kiến thức cơ bản không chỉ là biết cú pháp; đó là hiểu được lý do đằng sau các mẫu thiết kế mà Laravel sử dụng.
#🟢 Cấp độ: Người mới bắt đầu (Beginner)
Q1: Tại sao chúng ta cần Routing thay vì truy cập trực tiếp file PHP?
Trả lời: Để tách biệt URL khỏi cấu trúc file vật lý. Giúp tạo URL đẹp, quản lý bảo mật tập trung và dễ dàng thay đổi code mà không đổi link.
Q2: Middleware là gì (giải thích đơn giản)?
Trả lời: Là bộ lọc cho request HTTP. Giống như bouncer ở cửa hộp đêm, kiểm tra ID (Auth) hoặc trang phục (Validation) trước khi cho vào.
Q3: Blade Engine là gì?
Trả lời: Là templating engine mạnh mẽ của Laravel, cho phép viết code PHP trong HTML bằng cú pháp ngắn gọn và đẹp mắt.
Q4: Controller dùng để làm gì?
Trả lời: Là nơi tập trung logic xử lý các request HTTP. Nó nhận input, gọi model xử lý và trả về view hoặc json.
Q5: Cách tạo một project Laravel mới qua Composer?
Trả lời:
Dùng lệnh composer create-project laravel/laravel project-name.
Q6: Tham số trong Route (`{id}`) lấy ra ở đâu?
Trả lời: Laravel tự động truyền tham số đó vào hàm xử lý trong Controller theo thứ tự.
Q7: CSRF bảo vệ website khỏi điều gì?
Trả lời: Ngăn chặn kẻ xấu giả mạo request từ một trang web khác gửi tới server của bạn khi người dùng đang đăng nhập.
Q8: Làm thế nào để trả về một JSON response?
Trả lời:
Dùng response()->json($data). Laravel sẽ tự động set header Content-Type phù hợp.
Q9: Mục đích của thư mục `storage` trong Laravel?
Trả lời: Lưu trữ các file do ứng dụng sinh ra: log, cache, và các file upload từ người dùng.
Q10: Cách validate dữ liệu cơ bản trong Controller?
Trả lời:
Dùng $request->validate([...]). Nếu lỗi, Laravel tự động quay lại trang trước kèm theo thông báo lỗi.
#🟡 Cấp độ: Trung cấp (Intermediate)
Q1: Middleware giải quyết vấn đề gì trong các hệ thống lớn?
Trả lời: Giải quyết Cross-cutting concerns. Viết logic chung (như check admin) một lần và áp dụng cho hàng trăm route thay vì lặp lại code.
Q2: Tại sao nên dùng Form Requests thay vì viết validate trong Controller?
Trả lời: Để tuân thủ nguyên lý Single Responsibility. Tách biệt logic kiểm tra dữ liệu khỏi logic điều phối của Controller.
Q3: Phân biệt `Redirect::back()` và `Redirect::to()`.
Trả lời:
back() quay lại trang ngay trước đó (dựa trên session). to() chuyển hướng tới một URL cụ thể.
Q4: Giải thích khái niệm "Route Model Binding".
Trả lời:
Tự động inject instance của Model vào Controller dựa trên ID trong URL. Ví dụ: /users/1 sẽ tự tìm và đưa object User có ID 1 vào hàm.
Q5: View Composers là gì?
Trả lời: Là các callback hoặc class được gọi khi một view được render. Dùng để chia sẻ dữ liệu dùng chung (như menu, thông tin user) cho nhiều view mà không cần truyền thủ công ở mọi Controller.
Q6: "Named Routes" có lợi ích gì khi maintain ứng dụng?
Trả lời: Giúp tạo link qua tên route thay vì URL cứng. Khi bạn đổi URL trong file route, toàn bộ link trong View/Controller sẽ tự cập nhật theo.
Q7: Làm thế nào để group các routes lại với nhau?
Trả lời:
Dùng Route::middleware()->prefix()->group(function() { ... }). Giúp quản lý code sạch sẽ và tránh lặp lại cấu hình.
Q8: Cách truyền dữ liệu vào Blade component (`x-component`).
Trả lời:
Dùng cú pháp attributes: <x-alert type="error" :message="$msg" />. Dấu : dùng để truyền biến hoặc biểu thức PHP.
Q9: Phân biệt `Request::input()` và `Request::all()`.
Trả lời:
all() lấy toàn bộ dữ liệu. input('key') lấy một giá trị cụ thể, có thể cung cấp giá trị mặc định nếu key không tồn tại.
Q10: "Route Redirect" và "Route View" dùng trong trường hợp nào?
Trả lời: Dùng cho các route đơn giản không cần logic Controller. Giúp file route ngắn gọn và hiệu năng nhanh hơn một chút.
#🔴 Cấp độ: Nâng cao (Advanced)
Q1: Giải thích cơ chế "Pipeline" hoạt động bên trong Middleware và Router.
Trả lời:
Laravel dùng hàm array_reduce để bao bọc các middleware lồng vào nhau. Request đi từ ngoài vào trong, Response đi từ trong ra ngoài (mô hình củ hành).
Q2: Cách xử lý Validation cho mảng dữ liệu phức tạp (Nested Arrays)?
Trả lời:
Dùng dấu chấm (dot notation). Ví dụ: 'products.*.price' => 'required|numeric'. Laravel tự động duyệt qua toàn bộ mảng con để kiểm tra.
Q3: Làm thế nào để ghi đè (Override) thông báo lỗi validation mặc định toàn cục?
Trả lời:
Chỉnh sửa file ngôn ngữ trong lang/en/validation.php (hoặc vi). Hoặc định nghĩa method messages() trong Form Request class.
Q4: Phân tích cơ chế biên dịch (Compiling) của Blade.
Trả lời:
Blade chuyển cú pháp @... thành mã PHP thuần (<?php ... ?>) và lưu vào storage/framework/views. Laravel chỉ biên dịch lại khi file gốc thay đổi.
Q5: Làm thế nào để tạo một Custom Validation Rule riêng?
Trả lời:
Dùng lệnh php artisan make:rule. Implement interface ValidationRule và định nghĩa logic trong method validate().
Q6: "Resource Controllers" và cơ chế "Shallow Nesting" là gì?
Trả lời:
Tự động tạo 7 route chuẩn CRUD. Shallow nesting giúp rút gọn URL của các resource con khi đã biết ID của nó (ví dụ: /comments/1 thay vì /posts/1/comments/1).
Q7: Cách xử lý Authorization trực tiếp trong Form Request qua method `authorize()`.
Trả lời:
Laravel gọi method này trước khi chạy validation. Bạn có thể check quyền tại đây, nếu trả về false, user nhận ngay lỗi 403 Forbidden.
Q8: Giải thích về "Route Model Binding" tùy chỉnh (Customizing the Key).
Trả lời:
Mặc định dùng id. Bạn có thể đổi sang slug bằng cách định nghĩa getRouteKeyName() trong Model hoặc viết trực tiếp trong route: {post:slug}.
Q9: Làm thế nào để handle Exception toàn cục trong Laravel 11?
Trả lời:
Dùng callback withExceptions() trong file bootstrap/app.php. Bạn có thể dùng reportable() để log hoặc renderable() để trả về view lỗi tùy chỉnh.
Q10: "Fallback Routes" dùng để làm gì?
Trả lời: Định nghĩa route cuối cùng sẽ chạy nếu không có route nào khác khớp. Thường dùng để hiện trang 404 tùy chỉnh hoặc xử lý các SPA client-side routing.
#🧠 Cấp độ: Kiến trúc sư (Architect)
Q1: Thiết kế chiến lược Routing cho hệ thống khổng lồ có hàng nghìn route.
Trả lời:
- Chia file route theo module (ví dụ:
api_v1.php,admin.php). 2. Sử dụng Route Caching (php artisan route:cache). 3. Nhóm các route dùng chung middleware để giảm overhead.
Q2: Khi nào bạn nên tránh sử dụng Controller và dùng Closure trực tiếp trong Route?
Trả lời: CHỈ khi route cực kỳ đơn giản (như hiện 1 trang tĩnh). Tuy nhiên, Architect luôn khuyến khích dùng Controller vì Closure khiến việc Route Caching bị lỗi (trong các bản Laravel cũ) và khó tổ chức code.
Q3: Thiết kế hệ thống Validation đa tầng (Client-side, Server-side, Database-level).
Trả lời: Server-side là bắt buộc (Form Requests). Client-side để tăng UX. Database-level (Constraints) là lớp bảo vệ cuối cùng để đảm bảo toàn vẹn dữ liệu ngay cả khi code có bug.
Q4: Phân tích sự đánh đổi khi dùng Blade Components vs Vue/React trong cùng project.
Trả lời: Blade: Nhanh, SEO tốt, SSR mặc định. Vue/React: Tương tác cực cao nhưng tốn bundle size và cấu hình phức tạp. Giải pháp Architect: Dùng Inertia.js để gộp ưu điểm cả hai.
Q5: Thiết kế cơ chế "Dynamic Middleware" dựa trên dữ liệu Database.
Trả lời:
Tạo một middleware nhận tham số. Bên trong hàm handle, nó query database hoặc cache để quyết định cho phép request đi tiếp hay không.
Q6: Làm thế nào để tối ưu hóa "View Rendering" cho ứng dụng có hàng vạn request mỗi giây?
Trả lời:
- Bật View Cache. 2. Inline các CSS/JS nhỏ. 3. Sử dụng CDN cho file tĩnh. 4. Cân nhắc dùng Fragment Caching (cache từng phần HTML) lưu vào Redis.
Q7: Thiết kế hệ thống đa ngôn ngữ (Localization) cho URL mà vẫn đảm bảo SEO.
Trả lời:
Dùng prefix URL (ví dụ: /vi/about, /en/about). Dùng middleware để set Locale dựa trên segment đầu tiên. Đảm bảo có thẻ hreflang trong HTML.
Q8: Phân tích rủi ro bảo mật khi sử dụng directive `@php` hoặc `{!! !!}` trong Blade.
Trả lời:
@php cho phép viết code logic trong View (vi phạm MVC). {!! !!} không escape dữ liệu, nếu biến chứa input từ user sẽ dẫn đến lỗ hổng XSS nghiêm trọng.
Q9: Làm thế nào để xây dựng hệ thống "Feature Flags" ở mức Route level?
Trả lời:
Tạo một custom middleware CheckFeature. Nó kiểm tra trong cấu hình hoặc DB xem tính năng đó có bật không. Nếu tắt, trả về 404 hoặc 403.
Q10: Tầm nhìn: Tại sao Laravel 11 lại loại bỏ hầu hết các file cấu hình và Kernel mặc định?
Trả lời: Để giảm bớt sự choáng ngợp cho người mới và thúc đẩy kiến trúc “Lean”. Mọi cấu hình tập trung vào 1 chỗ giúp quản lý dễ dàng hơn và code khởi động nhanh hơn.
#💻 Practical Scenarios (Thực chiến)
S1: Bạn cần thực hiện validate một file upload lớn (20MB) và chỉ cho phép định dạng PDF. Cách làm?
Xử lý: Trong Form Request: 'document' => 'required|file|mimes:pdf|max:20480'. Cần lưu ý cấu hình upload_max_filesize trong php.ini cũng phải >= 20MB.
S2: Route `/user/{name}` bị tranh chấp với route `/user/settings`. Xử lý thế nào?
Xử lý: Đưa route /user/settings lên phía trên. Hoặc dùng regex để ràng buộc: Route::get('/user/{name}', ...)->where('name', '[A-Za-z]+').
#🚨 MUST-KNOW
- Luồng xử lý một Request cơ bản.
- Cách sử dụng CSRF protection.
- Cú pháp và cách hoạt động của Blade.
#⚠️ Pitfalls
- Quên không return kết quả từ Controller (trang trắng).
- Viết quá nhiều logic nghiệp vụ (tính toán, query DB) ngay trong file Route.
- Sử dụng biến không tồn tại trong Blade dẫn đến lỗi crash trang.
#🧩 Tips & Tricks
- Dùng lệnh
php artisan route:listthường xuyên để kiểm soát các đường dẫn của ứng dụng. - Sử dụng directive
@authvà@guestđể hiện nội dung theo trạng thái đăng nhập một cách gọn gàng.
Biên soạn bởi Senior Fullstack Developer & Laravel Mentor.