Thời gian đọc: 6 phút
Trong Laravel, Controller đóng vai trò là cầu nối giữa các yêu cầu HTTP từ người dùng và logic nghiệp vụ (business logic) của ứng dụng. Nó giúp tổ chức mã nguồn tốt hơn và tách biệt logic nghiệp vụ khỏi các yêu cầu HTTP. Controller nhận các yêu cầu từ route, xử lý logic, sau đó trả về phản hồi cho người dùng, thường là các view, JSON, hoặc redirect.
Dưới đây là những khái niệm và thông tin chi tiết về Controller trong Laravel:
Controller trong Laravel chịu trách nhiệm điều khiển luồng dữ liệu giữa các phần khác nhau của ứng dụng. Trong mô hình MVC (Model-View-Controller), Controller là nơi xử lý logic khi nhận dữ liệu từ View, gửi dữ liệu đến Model, và trả về dữ liệu đã xử lý cho View để hiển thị. Mỗi phương thức trong Controller có thể tương ứng với một hành động (action) cụ thể trên ứng dụng.
Trong Laravel, bạn có thể tạo một Controller bằng lệnh artisan:
php artisan make:controller TenController
Ví dụ, tạo một controller có tên là ProductController
:
php artisan make:controller ProductController
Điều này sẽ tạo một file controller tại thư mục app/Http/Controllers
với nội dung như sau:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ProductController extends Controller
{
//
}
Resource Controller trong Laravel giúp tạo các phương thức CRUD mặc định (Create, Read, Update, Delete). Để tạo một Resource Controller, sử dụng lệnh sau:
php artisan make:controller ProductController --resource
Điều này sẽ tạo ra một controller với các phương thức sau:
index()
: Hiển thị danh sách tài nguyên.create()
: Hiển thị form để tạo tài nguyên mới.store()
: Lưu tài nguyên mới vào cơ sở dữ liệu.show()
: Hiển thị một tài nguyên cụ thể.edit()
: Hiển thị form chỉnh sửa một tài nguyên cụ thể.update()
: Cập nhật tài nguyên đã tồn tại.destroy()
: Xóa một tài nguyên cụ thể.
class ProductController extends Controller
{
public function index()
{
// Hiển thị danh sách các sản phẩm
}
public function create()
{
// Hiển thị form tạo sản phẩm mới
}
public function store(Request $request)
{
// Lưu sản phẩm mới
}
public function show($id)
{
// Hiển thị chi tiết sản phẩm
}
public function edit($id)
{
// Hiển thị form chỉnh sửa sản phẩm
}
public function update(Request $request, $id)
{
// Cập nhật sản phẩm
}
public function destroy($id)
{
// Xóa sản phẩm
}
}
Laravel cũng cung cấp một tùy chọn để tạo API Resource Controller, phù hợp với các ứng dụng chỉ cung cấp API mà không cần view. Bạn có thể tạo nó bằng lệnh sau:
php artisan make:controller ApiProductController --api
API Resource Controller sẽ chỉ bao gồm các phương thức liên quan đến dữ liệu (index, store, show, update, destroy) mà không có create
và edit
, vì API không yêu cầu các phương thức đó.
Controller trong Laravel được kết nối với route thông qua file route (thường nằm trong thư mục routes/web.php
hoặc routes/api.php
cho các route API).
Bạn có thể tạo route đơn giản và kết nối nó với một phương thức trong Controller như sau:
Route::get('/products', [ProductController::class, 'index']);
Route::get('/products/{id}', [ProductController::class, 'show']);
Laravel hỗ trợ route resource tự động ánh xạ đến các phương thức trong Resource Controller. Bạn chỉ cần khai báo một dòng code cho tất cả các route cần thiết của CRUD:
Route::resource('products', ProductController::class);
Route resource sẽ tự động tạo ra các route sau:
Verb | URI | Action | Route Name |
---|---|---|---|
GET | /products | index | products.index |
GET | /products/create | create | products.create |
POST | /products | store | products.store |
GET | /products/{product} | show | products.show |
GET | /products/{product}/edit | edit | products.edit |
PUT | /products/{product} | update | products.update |
DELETE | /products/{product} | destroy | products.destroy |
Đối với API, bạn có thể sử dụng route resource API với tùy chọn apiResource
. Điều này sẽ tạo ra các route API tương tự nhưng không bao gồm các phương thức create
và edit
:
Route::apiResource('products', ApiProductController::class);
Middleware là các lớp trung gian được sử dụng để lọc các yêu cầu HTTP trước khi chúng được xử lý bởi Controller. Bạn có thể áp dụng middleware cho Controller bằng cách sử dụng phương thức middleware
:
class ProductController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
public function index()
{
// Chỉ người dùng đã đăng nhập mới có thể truy cập
}
}
Bạn cũng có thể áp dụng middleware chỉ cho một số phương thức cụ thể bằng cách sử dụng only
hoặc except
:
class ProductController extends Controller
{
public function __construct()
{
$this->middleware('auth')->only(['create', 'store']);
$this->middleware('auth')->except(['index', 'show']);
}
}
Laravel hỗ trợ Dependency Injection để dễ dàng truyền các service hoặc model vào controller. Bạn có thể sử dụng Dependency Injection trong các phương thức của controller hoặc trong constructor.
class ProductController extends Controller
{
protected $productService;
public function __construct(ProductService $productService)
{
$this->productService = $productService;
}
public function index()
{
$products = $this->productService->getAllProducts();
return view('products.index', compact('products'));
}
}
Laravel cung cấp các phương pháp đơn giản để thực hiện Request Validation ngay bên trong controller bằng cách sử dụng phương thức validate
.
public function store(Request $request)
{
$validated = $request->validate([
'name' => 'required|max:255',
'price' => 'required|numeric',
]);
// Xử lý sau khi validation thành công
}
Bạn cũng có thể tạo một lớp Form Request để tách validation khỏi controller, giúp code dễ bảo trì hơn.
php artisan make:request StoreProductRequest
Trong class StoreProductRequest
, bạn định nghĩa các quy tắc:
public function rules()
{
return [
'name' => 'required|max:255',
'price' => 'required|numeric',
];
}
Trong controller, bạn sử dụng class này để validate:
public function store(StoreProductRequest $request)
{
// Xử lý sau khi validation thành công
}
Trong controller, bạn có thể trả về một view bằng cách sử dụng phương thức view
:
public function index()
{
$products = Product::all();
return view('products.index', compact('products'));
}
Laravel cung cấp nhiều loại Response khác nhau từ controller, bao gồm:
return view('view.name');
return response()->json($data);
return redirect()->route('route.name');
return response()->download($filePath);
Controller trong Laravel là một phần quan trọng giúp tổ chức và điều khiển luồng dữ liệu trong ứng dụng. Bằng cách sử dụng các phương pháp như Resource Controller, Middleware, Dependency Injection và Request Validation, bạn có thể xây dựng các ứng dụng Laravel mạnh mẽ, dễ bảo trì và mở rộng.