Route được khai báo, không theo tên file
Khác Next.js, Laravel không sinh route từ thư mục. Bạn khai báo trong routes/web.php:
use App\Http\Controllers\ProductController;
use Illuminate\Support\Facades\Route;
Route::get('/', fn () => view('welcome'));
Route::get('/san-pham/{id}', function (string $id) {
return "Sản phẩm số {$id}";
})->whereNumber('id')->name('products.show-simple');
Route::prefix('admin')->middleware('auth')->group(function () {
Route::get('/don-hang', [OrderController::class, 'index'])->name('admin.orders');
});
- Tham số đặt trong ngoặc nhọn và tự truyền vào hàm. Có thể ràng buộc kiểu (whereNumber) hoặc cho phép bỏ trống bằng dấu ? sau tên tham số.
- Route có tên: đặt tên bằng name() rồi tạo URL bằng
route('admin.orders'). Đổi đường dẫn sau này không phải sửa khắp nơi. - Nhóm route: dùng chung tiền tố, middleware.
Controller
php artisan make:controller ProductController --model=Product --resource --requests
Lệnh trên tạo controller "resource" với 7 hàm chuẩn: index (danh sách), create (form tạo), store (lưu), show (xem), edit (form sửa), update (cập nhật), destroy (xóa). Một dòng đăng ký đủ cả 7 route:
Route::resource('products', ProductController::class);
// chỉ cần vài hàm: ->only(['index', 'show'])
Route model binding: Laravel tự tìm bản ghi
Route::get('/products/{product}', [ProductController::class, 'show']);
public function show(Product $product) // Laravel tự tìm Product theo id, không thấy thì trả 404
{
return view('products.show', ['product' => $product]);
}
Muốn tìm theo slug thay vì id: viết {product:slug} trong route, hoặc đặt attribute #[RouteKey('slug')] lên model (Laravel 13).
Middleware cho controller
Route::get('/tai-khoan', [AccountController::class, 'show'])->middleware('auth');
Laravel 13 cho phép gắn trực tiếp lên controller bằng attribute #[Middleware('auth')]. Cả hai cách đều phổ biến.
Gõ php artisan route:list để xem mọi route, controller xử lý và middleware đi kèm. Đây cũng là lệnh đầu tiên nên chạy khi mở một dự án lạ.
Bài tập
- Tạo model Product kèm controller resource (lệnh ở trên).
- Đăng ký
Route::resource('products', ...)và xem 7 route trong route:list. - Cho hàm index trả về chữ "Danh sách sản phẩm", show trả về id sản phẩm.
- Thêm một route có tên rồi dùng
route()trong tinker để in ra URL.
Xem thêm
- Simplify Laravel Routes with Powerful Model Binding Techniques (kênh Laravel, tiếng Anh, 16 phút)
- Bài 6: Controller & Resource Controller trong Laravel 12 (kênh Hải Đăng Dev, tiếng Việt, 11 phút)