Laravel là một framework PHP mạnh mẽ và thanh lịch, được thiết kế để giúp các nhà phát triển xây dựng các ứng dụng web phức tạp một cách dễ dàng. Để tận dụng tối đa Laravel, điều quan trọng là phải tuân theo các phương pháp hay nhất đã được thiết lập. Bài viết này sẽ thảo luận về một số phương pháp hay nhất quan trọng nhất của Laravel.
1. Fat Models, Skinny Controllers
- Bộ điều khiển (Controller) chỉ nên đóng vai trò như một người điều phối yêu cầu, tập trung vào việc xử lý các yêu cầu HTTP và không nên chứa quá nhiều logic.
- Mô hình (Model) chịu trách nhiệm xử lý dữ liệu và quan hệ, nơi nó có thể được tái sử dụng và kiểm tra dễ dàng hơn.
Ví dụ: ❌ Bad (Controller quá nhiều logic)
public function store(Request $request)
{
$user = new User();
$user->name = $request->input('name');
$user->email = $request->input('email');
$user->password = bcrypt($request->input('password'));
$user->save();
return response()->json(['message' => 'User created successfully']);
}✅ Good (Sử dụng Model để xử lý logic)
public function store(Request $request)
{
$user = User::createUser($request->all());
return response()->json(['message' => 'User created successfully']);
}class User extends Model
{
protected $fillable = ['name', 'email', 'password'];
public static function createUser($data)
{
$data['password'] = bcrypt($data['password']);
return self::create($data);
}
}2. Single Responsibility Principle - SRP (Nguyên tắc trách nhiệm đơn lẻ)
- Mỗi lớp và phương thức chỉ nên có một trách nhiệm duy nhất.
- Điều này giúp cho code dễ hiểu, bảo trì và kiểm tra hơn.
❌ Bad (Lớp thực hiện nhiều nhiệm vụ khác nhau)
class Order
{
public function createOrder($data)
{
// Lưu đơn hàng
}
public function sendEmail($email)
{
// Gửi email xác nhận
}
}✅ Good (Tách riêng thành Service)
class OrderService
{
public function createOrder($data)
{
return Order::create($data);
}
}
class EmailService
{
public function sendEmail($email)
{
// Gửi email xác nhận
}
}3. Methods Should Do Just One Thing (Mỗi phương thức chỉ nên làm một việc)
- Các phương thức ngắn gọn và tập trung dễ đọc và kiểm tra hơn.
- Điều này cũng giúp cho code dễ tái sử dụng hơn.
❌ Bad (Một phương thức xử lý nhiều việc cùng lúc)
public function processOrder(Order $order)
{
// Tính toán tổng số tiền
// Cập nhật trạng thái đơn hàng
// Gửi email xác nhận
}✅ Good (Tách nhỏ nhiệm vụ)
public function calculateTotal(Order $order)
{
// Tính toán tổng số tiền
}
public function updateStatus(Order $order, $status)
{
// Cập nhật trạng thái đơn hàng
}
public function sendConfirmationEmail(Order $order)
{
// Gửi email xác nhận
}4. Keep Business Logic in Service Classes (Giữ logic nghiệp vụ trong các lớp dịch vụ)
- Các lớp dịch vụ giúp tách logic nghiệp vụ khỏi bộ điều khiển và mô hình.
- Điều này giúp cho code dễ kiểm tra, bảo trì và tái sử dụng hơn.
❌ Bad (Logic phức tạp trong Controller)
public function checkout(Request $request)
{
$order = Order::create($request->all());
Mail::to($request->user())->send(new OrderConfirmation($order));
return response()->json(['message' => 'Order processed successfully']);
}✅ Good (Tách thành Service Class)
public function checkout(Request $request, OrderService $orderService)
{
$orderService->processOrder($request->all());
return response()->json(['message' => 'Order processed successfully']);
}class OrderService
{
public function processOrder($data)
{
$order = Order::create($data);
Mail::to($data['email'])->send(new OrderConfirmation($order));
}
}5. Use Relationships for Cleaner Code (Sử dụng quan hệ để có code sạch hơn)
Tại sao?
- Các quan hệ Eloquent giúp đơn giản hóa việc truy xuất dữ liệu liên quan.
- Điều này giúp cho code dễ đọc và bảo trì hơn.
❌ Bad (Truy vấn thủ công không cần thiết)
$orders = Order::where('user_id', $user->id)->get();✅ Good (Sử dụng quan hệ Eloquent)
$orders = $user->orders;class User extends Model
{
public function orders()
{
return $this->hasMany(Order::class);
}
}6. Use Database Transactions for Atomic Business Operations (Sử dụng giao dịch cơ sở dữ liệu cho các hoạt động nghiệp vụ nguyên tử)
- Giao dịch đảm bảo rằng tất cả các hoạt động cơ sở dữ liệu đều thành công hoặc không hoạt động nào được thực hiện.
- Điều này giúp ngăn ngừa tình trạng dữ liệu không nhất quán.
✅ Good (Đảm bảo tính toàn vẹn dữ liệu)
DB::transaction(function () use ($data) {
$order = Order::create($data);
Payment::process($order);
});7. Inject Dependencies (Tiêm phụ thuộc)
- Tiêm phụ thuộc giúp giảm sự phụ thuộc giữa các lớp.
- Điều này giúp cho code dễ kiểm tra, bảo trì và tái sử dụng hơn.
❌ Bad:
public function __construct()
{
$this->service = new OrderService();
}✅ Good:
class UserController extends Controller
{
protected $userService;
public function __construct(UserService $userService)
{
$this->userService = $userService;
}
}8. Chunk Data for Performance (Chia nhỏ dữ liệu để tăng hiệu suất)
- Chia nhỏ dữ liệu giúp giảm mức sử dụng bộ nhớ khi xử lý các tập dữ liệu lớn.
- Điều này giúp cải thiện hiệu suất của ứng dụng.
✅ Good:
$users = User::all();
User::chunk(100, function ($users) {
foreach ($users as $user) {
$this->processUser($user);
}
});9. Use Constants Instead of Hardcoded Values (Sử dụng hằng số thay vì giá trị được mã hóa cứng)
- Hằng số giúp cho mã code dễ đọc và bảo trì hơn.
- Điều này cũng giúp ngăn ngừa lỗi do nhập sai giá trị
❌ Bad:
public function isAdmin(User $user): bool
{
return $user->type === 'admin';
}✅ Good:
public function isAdmin(User $user)
{
return $user->type === UserType::ADMIN;
}10. Avoid Directly Using .env in Code (Tránh sử dụng trực tiếp .env trong mã)
- Tệp .env chứa các cài đặt cấu hình nhạy cảm.
- Tránh sử dụng trực tiếp .env trong mã code giúp bảo vệ các cài đặt này khỏi bị lộ thông tin.
❌ Bad:
$apiKey = env('API_KEY');✅ Good:
$apiKey = config('services.api.key');Kết luận
Bằng cách áp dụng các phương pháp trên, bạn sẽ có thể viết code Laravel chuyên nghiệp hơn, dễ bảo trì hơn và tối ưu hóa hiệu suất ứng dụng. Hãy thực hành ngay để nâng cao kỹ năng lập trình của bạn!
Cảm ơn bạn đã đọc bài viết, hãy theo dõi CodeTutHub để cập nhật thêm kiến thức lập trình Laravel hữu ích!









