Laravel Routing và Controllers là gì?
1. Laravel Routing là gì?
Laravel Routing (định tuyến trong Laravel) là cơ chế xác định cách ứng dụng tiếp nhận và xử lý HTTP request dựa trên những thông tin như HTTP method và URL. Một route có thể chuyển request đến Controller, thực thi Closure (hàm ẩn danh) hoặc trả về một response phù hợp.
Ví dụ, khi người dùng truy cập /products, ứng dụng có thể trả về danh sách sản phẩm. Khi truy cập /products/10, ứng dụng có thể trả về thông tin chi tiết của sản phẩm có ID là 10.
1.1. Nơi khai báo route
Các route thường được khai báo trong những tệp PHP thuộc thư mục routes/.

web.php: thường chứa các route phục vụ giao diện web, được tích hợp những cơ chế như session và CSRF protection theo middleware được cấu hình.api.php: thường dùng để khai báo các endpoint API. Việc tệp này có sẵn và được nạp như thế nào phụ thuộc vào phiên bản và cấu hình Laravel.- Các tệp route tùy chỉnh: có thể được sử dụng để tổ chức route theo chức năng hoặc khu vực của ứng dụng, nhưng cần được đăng ký với framework.
Không phải mọi tệp PHP được tạo trong thư mục routes/ đều tự động được Laravel nạp.
1.2. Các HTTP method thường dùng
Laravel cung cấp những phương thức khai báo route tương ứng với các HTTP method phổ biến:
Route::get(): thường dùng để truy xuất dữ liệu.Route::post(): thường dùng để gửi dữ liệu, tạo tài nguyên hoặc thực hiện một thao tác.Route::put()vàRoute::patch(): thường dùng để cập nhật tài nguyên.Route::delete(): thường dùng để xóa tài nguyên.Route::options(): dùng để xử lý requestOPTIONS.
Ví dụ:
use Illuminate\Support\Facades\Route;
Route::get('/hello', function () {
return 'Hello World';
});
Khi client gửi request GET /hello và request khớp với route trên, Laravel thực thi Closure và trả về nội dung Hello World.
Ý nghĩa thực tế của mỗi HTTP method còn phụ thuộc vào cách ứng dụng thiết kế và xử lý request.
1.3. Route Parameters
Route Parameters cho phép khai báo những phần động trong URL để nhận dữ liệu từ request.
Route::get('/users/{id}', function (string $id) {
return "User ID: " . $id;
});
Với URL /users/10, giá trị 10 được truyền vào tham số $id.
Laravel cũng hỗ trợ tham số tùy chọn, chẳng hạn {name?}. Khi sử dụng tham số tùy chọn, cần khai báo giá trị mặc định tương ứng trong hàm xử lý nếu tham số có thể không được truyền vào.
1.4. Named Routes
Named Routes cho phép đặt tên định danh cho route để tham chiếu đến route đó mà không phải viết trực tiếp URL ở nhiều nơi.
Route::get('/products', function () {
return 'Danh sách sản phẩm';
})->name('products.index');
Có thể tạo URL thông qua helper route():
$url = route('products.index');
Nếu URL thay đổi nhưng tên route vẫn được giữ nguyên, những vị trí sử dụng route('products.index') thường không cần chỉnh sửa.
1.5. Route Groups
Route Groups cho phép nhóm nhiều route có chung cấu hình như middleware, tiền tố URL hoặc tiền tố tên route.
Route::prefix('admin')->group(function () {
Route::get('/products', function () {
return 'Quản lý sản phẩm';
});
});
Route trên có URL /admin/products.
Tiền tố URL giúp tổ chức đường dẫn, nhưng không tự động bảo vệ khu vực quản trị. Nếu cần giới hạn quyền truy cập, ứng dụng phải cấu hình middleware xác thực hoặc phân quyền phù hợp.
1.6. Route Model Binding
Route Model Binding cho phép Laravel tự tìm và truyền một model vào hàm xử lý dựa trên tham số URL.
use App\Models\User;
use Illuminate\Support\Facades\Route;
Route::get('/users/{user}', function (User $user) {
return $user;
});
Khi nhận request đến /users/10, Laravel mặc định có thể tìm model User có khóa chính tương ứng với 10 và truyền đối tượng đó vào hàm xử lý. Nếu không tìm thấy bản ghi phù hợp, Laravel thường trả về HTTP 404.
Cơ chế này giúp giảm mã truy vấn lặp lại và thuận tiện khi kết hợp Routing với Controllers.
2. Laravel Controller là gì?
Laravel Controller là lớp dùng để nhóm và tổ chức các phương thức xử lý request có liên quan. Controller giúp mã nguồn rõ ràng hơn so với việc đặt toàn bộ logic xử lý trực tiếp trong các route.
Trong mô hình MVC (Model – View – Controller):
- Model: đại diện cho dữ liệu và thường đảm nhiệm việc tương tác với cơ sở dữ liệu, chẳng hạn thông qua Eloquent ORM.
- View: chịu trách nhiệm trình bày giao diện, thường sử dụng Blade trong ứng dụng render HTML phía máy chủ.
- Controller: tiếp nhận việc xử lý sau khi request được định tuyến, điều phối các thành phần cần thiết và trả về kết quả như View, JSON hoặc redirect.
Các Controller thông thường được đặt trong thư mục app/Http/Controllers/.
2.1. Vai trò của Controller
Controller có một số vai trò chính:
- Tổ chức mã nguồn: tách phần xử lý request khỏi các khai báo route.
- Tách biệt trách nhiệm: giúp phân chia việc định tuyến, điều phối xử lý, truy cập dữ liệu và trình bày giao diện.
- Hỗ trợ tái sử dụng: các thành phần xử lý có thể được tổ chức để sử dụng ở nhiều nơi khi phù hợp.
- Tích hợp middleware và Dependency Injection: hỗ trợ xác thực, phân quyền và tiếp nhận các dependency cần thiết.
Tuy nhiên, Controller không nên trở thành nơi chứa toàn bộ nghiệp vụ của ứng dụng. Khi logic trở nên phức tạp, lập trình viên có thể tách phần nghiệp vụ sang service hoặc những lớp phù hợp khác.
2.2. Tạo Controller bằng Artisan
Laravel cung cấp Artisan, một công cụ dòng lệnh giúp tạo Controller và thực hiện các tác vụ phát triển ứng dụng.
Tạo Controller cơ bản:
php artisan make:controller UserController
Lệnh này tạo Controller cơ bản tại app/Http/Controllers/UserController.php.
Tạo Resource Controller:
php artisan make:controller PhotoController --resource
Resource Controller được tạo với bảy phương thức theo quy ước:
| Phương thức | Chức năng thường gặp |
|---|---|
index |
Hiển thị danh sách tài nguyên |
create |
Hiển thị biểu mẫu tạo tài nguyên |
store |
Xử lý việc tạo tài nguyên |
show |
Hiển thị chi tiết tài nguyên |
edit |
Hiển thị biểu mẫu chỉnh sửa |
update |
Xử lý việc cập nhật tài nguyên |
destroy |
Xử lý việc xóa tài nguyên |
Các phương thức này là bộ khung để lập trình viên triển khai chức năng; Laravel không tự động viết toàn bộ logic nghiệp vụ.
Tạo Resource Controller gắn với Model:
php artisan make:controller PostController --model=Post --resource
Lệnh này kết hợp các tùy chọn tạo Resource Controller và khai báo Model liên quan theo cơ chế Artisan hỗ trợ. Nó không tự triển khai toàn bộ nghiệp vụ truy vấn, tạo, cập nhật hoặc xóa dữ liệu.
Tạo Single Action Controller:
php artisan make:controller ProvisionServer --invokable
Invokable Controller được thiết kế để thực hiện một hành động chính thông qua phương thức __invoke().
<?php
namespace App\Http\Controllers;
class ProvisionServer extends Controller
{
public function __invoke()
{
return 'Provision server';
}
}
Loại Controller này phù hợp khi muốn tách một hành động cụ thể thành một lớp riêng.
2.3. Định nghĩa phương thức xử lý
Một Controller có thể chứa nhiều phương thức public, mỗi phương thức đảm nhiệm một hành động. Route sẽ trỏ đến phương thức tương ứng để xử lý request.
Ví dụ, UserController có thể được viết như sau:
<?php
namespace App\Http\Controllers;
use App\Models\User;
class UserController extends Controller
{
public function index()
{
$users = User::all();
return view('users.index', compact('users'));
}
public function show($id)
{
$user = User::findOrFail($id);
return view('users.show', ['user' => $user]);
}
}
Trong ví dụ trên:
index()lấy danh sách người dùng rồi truyền dữ liệu sang Viewusers.index.show($id)tìm người dùng theo ID. Nếu không tìm thấy bản ghi,findOrFail()phát sinh ngoại lệ và Laravel thường trả về HTTP404.view()tạo response sử dụng View Blade.compact('users')tạo mảng dữ liệu có khóausersđể truyền sang View.
Ví dụ giả định Model User, cơ sở dữ liệu và hai View tương ứng đã được thiết lập. Trong ứng dụng có số lượng bản ghi lớn, nên cân nhắc phân trang thay vì sử dụng User::all() để lấy toàn bộ dữ liệu.
2.4. Đăng ký route để gọi Controller
Trong routes/web.php:
use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Route;
Route::get('/users', [UserController::class, 'index']);
Route::get('/users/{id}', [UserController::class, 'show']);
Khi client gửi request GET /users, Laravel định tuyến đến phương thức index() của UserController. Với request GET /users/10, Laravel gọi show() và truyền giá trị 10 vào tham số $id.
Đây là cách kết nối cơ bản giữa Routing và Controllers: Route xác định phương thức xử lý, còn Controller điều phối các bước cần thiết để tạo response.
3. Kết nối Routing với Controllers
Trong một ứng dụng thực tế, Routing và Controllers phối hợp để xử lý request theo từng chức năng.
Thay vì đặt logic xử lý trực tiếp trong Closure của route, lập trình viên có thể khai báo route trỏ đến phương thức của Controller.
Ví dụ với chức năng quản lý sản phẩm:
use App\Http\Controllers\ProductController;
use Illuminate\Support\Facades\Route;
Route::get('/products', [ProductController::class, 'index']);
Route::get('/products/{id}', [ProductController::class, 'show']);
Hai route cùng sử dụng ProductController nhưng gọi các phương thức khác nhau:
index()xử lý yêu cầu lấy danh sách sản phẩm.show()xử lý yêu cầu xem thông tin một sản phẩm theo ID.
Cách tổ chức này giúp các route gọn gàng hơn, đồng thời phân chia những hành động liên quan thành các phương thức riêng biệt.
4. Laravel xử lý HTTP request như thế nào?
Để hiểu cách Routing và Controllers phối hợp, hãy xét trường hợp client gửi request GET /products/10 nhằm lấy thông tin sản phẩm có ID là 10.
Quá trình xử lý có thể được giản lược thành các bước:
- Client gửi request: trình duyệt hoặc ứng dụng gửi HTTP request đến máy chủ.
- Laravel tiếp nhận request: request đi qua các bước khởi tạo và xử lý ban đầu của ứng dụng.
- Xác định route: Laravel tìm route phù hợp với HTTP method và URL.
- Middleware xử lý: các middleware được cấu hình có thể thực hiện xác thực, phân quyền, ghi log hoặc những tác vụ khác.
- Controller xử lý: Laravel gọi phương thức
show()củaProductControllervà truyền tham số tương ứng. - Truy xuất dữ liệu nếu cần: Controller có thể gọi Model hoặc service để lấy thông tin sản phẩm.
- Tạo response: ứng dụng trả về JSON, HTML hoặc một loại response khác.
- Response được gửi về client: response có thể tiếp tục đi qua các bước xử lý liên quan trước khi được gửi đến nơi gọi.
Mô hình minh họa:
Client
|
v
Laravel Application
|
v
Routing
|
v
Middleware
|
v
ProductController@show
|
v
Model / Service (nếu cần)
|
v
HTTP Response
|
v
Client
Đây là mô hình khái quát để dễ hình dung, không phải thứ tự đầy đủ của mọi request trong Laravel. Thứ tự và các bước thực tế phụ thuộc vào phiên bản framework, cấu hình ứng dụng và những middleware được đăng ký.
Điểm quan trọng là Routing, Middleware, Controller và Model có trách nhiệm khác nhau nhưng phối hợp với nhau để xử lý request.
5. Các tính năng Routing và Controllers thường dùng
5.1. Named Routes và tạo URL
Khi cần liên kết đến một route ở nhiều vị trí, nên cân nhắc sử dụng tên route:
Route::get('/products', [ProductController::class, 'index'])
->name('products.index');
Sau đó, có thể tạo URL bằng:
$url = route('products.index');
Cách này giảm sự phụ thuộc vào URL được viết trực tiếp trong mã nguồn và giúp bảo trì thuận tiện hơn.
5.2. Route Groups và Middleware
Route Groups giúp nhóm những route có cấu hình chung:
Route::prefix('admin')
->middleware('auth')
->group(function () {
Route::get('/products', [
ProductController::class,
'index'
]);
});
Trong ví dụ này, route có URL /admin/products và sử dụng middleware auth theo cấu hình của ứng dụng.
Middleware auth thường dùng để kiểm tra trạng thái đăng nhập, nhưng yêu cầu phân quyền theo vai trò hoặc tài nguyên có thể cần thêm cơ chế authorization phù hợp.
5.3. Resource Controllers
Nếu một tài nguyên có các hành động CRUD phổ biến, có thể sử dụng Route::resource():
Route::resource('products', ProductController::class);
Laravel sẽ đăng ký các route theo quy ước resource, liên kết những URL và HTTP method tương ứng với các phương thức như index, create, store, show, edit, update và destroy.
Nếu chỉ cần một số hành động, có thể giới hạn route được đăng ký:
Route::resource('products', ProductController::class)
->only(['index', 'show', 'store']);
Resource Controllers phù hợp với các chức năng quản lý tài nguyên. Tuy nhiên, việc khai báo resource route không tự động hoàn thiện logic nghiệp vụ của từng phương thức.
5.4. Dependency Injection
Dependency Injection là cơ chế cung cấp các đối tượng mà một lớp hoặc phương thức cần sử dụng, thay vì để chúng tự khởi tạo mọi dependency.
Ví dụ, Controller có thể nhận đối tượng Request:
use Illuminate\Http\Request;
public function store(Request $request)
{
$name = $request->input('name');
// Tiếp tục kiểm tra và xử lý dữ liệu
}
Khi phương thức được gọi thông qua cơ chế xử lý request của Laravel, framework sẽ cung cấp đối tượng Request tương ứng.
Cơ chế này cũng có thể được sử dụng với các service được quản lý bởi Service Container. Nhờ đó, Controller có thể sử dụng các thành phần cần thiết mà không phải tự quản lý việc khởi tạo tất cả đối tượng.
5.5. Kiểm tra các route đã đăng ký
Trong quá trình phát triển và gỡ lỗi, có thể sử dụng lệnh:
php artisan route:list
Lệnh này hiển thị danh sách route đã được đăng ký cùng những thông tin như HTTP method, URI, tên route và action xử lý. Đây là cách nhanh để kiểm tra route có được khai báo đúng hay không.
Tùy phiên bản Laravel, lệnh có thể hỗ trợ thêm các tùy chọn lọc hoặc hiển thị chi tiết.
6. Một số nguyên tắc khi sử dụng Routing và Controllers
Để mã nguồn dễ đọc và bảo trì, nên lưu ý:
- Giữ route rõ ràng: route nên tập trung vào việc khai báo URL, HTTP method và phương thức xử lý.
- Không dồn toàn bộ nghiệp vụ vào Controller: khi logic phức tạp, có thể tách sang service hoặc lớp phù hợp.
- Kiểm tra dữ liệu đầu vào: không nên sử dụng dữ liệu client gửi lên mà không kiểm tra và xác thực phù hợp.
- Phân biệt xác thực và phân quyền: xác thực xác định người dùng là ai; phân quyền xác định người dùng được phép thực hiện thao tác nào.
- Tránh truy vấn dữ liệu không cần thiết: cân nhắc phân trang khi lấy danh sách lớn và chỉ truy xuất dữ liệu cần dùng.
- Kiểm tra route khi gỡ lỗi: sử dụng
php artisan route:listđể xác nhận route, method và action. - Tham khảo tài liệu đúng phiên bản: một số cách khai báo và cấu hình route có thể khác nhau giữa các phiên bản Laravel.
Kết luận
Laravel Routing và Controllers là hai thành phần quan trọng trong quá trình xử lý HTTP request của một ứng dụng Laravel. Routing xác định request sẽ được chuyển đến đâu, trong khi Controller tổ chức và điều phối các bước xử lý để tạo response.
Khi kết hợp với Middleware, Model, Service Container và các cơ chế như Route Model Binding hoặc Resource Controllers, lập trình viên có thể xây dựng ứng dụng có cấu trúc rõ ràng và thuận tiện hơn khi mở rộng.
Nắm vững cách các thành phần này phối hợp là nền tảng để tiếp tục tìm hiểu về Eloquent ORM, validation, authentication, authorization và cách xây dựng REST API bằng Laravel.







Khoá học lập trình game con rắn cho trẻ em




