+2

Composer hoạt động như thế nào? Đừng chỉ gõ lệnh mà không hiểu "phép thuật" đằng sau!

Chào các bạn,

Nếu bạn làm việc với PHP (đặc biệt là Laravel), composer install hay composer require chắc chắn là những câu lệnh "cửa miệng". Nhưng đã bao giờ bạn tự hỏi: Tại sao chỉ cần một file composer.json mà nó có thể kéo cả "thế giới" thư viện về, lại còn quản lý được phiên bản sao cho không xung đột lẫn nhau?

Hôm nay, hãy cùng mình "mổ xẻ" xem Composer thực sự hoạt động như thế nào nhé!

1. Composer không phải là Package Manager (giống như Yum hay Apt)

Đây là một hiểu lầm phổ biến. Composer thực tế là một Dependency Manager (Trình quản lý phụ thuộc).

  • Package Manager: Cài đặt thư viện lên toàn hệ thống (global).
  • Dependency Manager: Cài đặt thư viện dựa trên từng dự án cụ thể. Mỗi dự án có một "túi đồ" riêng (thư mục vendor), không ông nào đụng chạm ông nào.

2. "Bộ não" của hệ thống: composer.json và composer.lock

Để hiểu cách Composer vận hành, bạn cần nắm rõ hai file quan trọng nhất này:

  • composer.json (Bản danh sách mong muốn): Đây là nơi bạn khai báo các thư viện bạn muốn có và phiên bản tương ứng (ví dụ: ^8.0). Nó giống như bạn đưa một tờ giấy ghi: "Tôi muốn mua một chai dầu ăn loại nào cũng được, miễn là sản xuất sau năm 2023".
  • composer.lock (Bản cam kết): Đây là nơi ghi lại chính xác phiên bản mà Composer đã cài đặt thực tế. Nếu composer.json nói là "sau năm 2023", thì composer.lock sẽ ghi đích danh: "Chai dầu ăn hãng A, sản xuất ngày 15/05/2024".
  • Lưu ý cực quan trọng: File .lock giúp đảm bảo mọi thành viên trong team và server deploy đều dùng chung một bộ source code y hệt nhau đến từng dấu phẩy.

3. Quy trình "Đi chợ" của Composer

Khi bạn gõ composer install, một quy trình logic phức tạp sẽ diễn ra:

  1. Kiểm tra file Lock: Nếu có file composer.lock, nó sẽ lờ đi file .json và cài đúng những gì được ghi trong file lock.
  2. Giải quyết phụ thuộc (Dependency Resolution): Nếu không có file lock (hoặc bạn gõ composer update), Composer sẽ bắt đầu "hack não". Nó sẽ lên Packagist.org (chợ trung tâm) để tìm thư viện bạn cần. Sau đó, nó kiểm tra xem thư viện đó có cần thư viện khác không (phụ thuộc của phụ thuộc).
  • Ví dụ: Bạn cần thư viện A, mà A cần B v2.0, nhưng bạn lại đang cài C (cần B v1.0). Composer sẽ tính toán để tìm ra một phiên bản B chung nhất mà cả A và C đều hài lòng. Nếu không tìm được, nó sẽ báo lỗi "Dependency hell" huyền thoại.
  1. Tải về và đặt vào vendor: Sau khi chốt được danh sách, nó tải code về và ném vào thư mục vendor.
  2. Tạo file Autoload: Đây là bước "ma thuật" nhất.

4. Phép thuật Autoloading - Cầu nối đến Code của bạn

Sau khi tải xong, Composer tạo ra một file tại vendor/autoload.php. Tại sao chúng ta luôn phải require 'vendor/autoload.php'; ở đầu dự án?

Thay vì bạn phải viết hàng trăm dòng include hay require cho từng file thư viện, Composer sử dụng chuẩn PSR-4. Khi bạn gọi một Class trong code, Autoloader sẽ tự động tính toán đường dẫn file dựa trên Namespace và nạp nó vào bộ nhớ chỉ khi cần thiết (Lazy loading). Việc này giúp ứng dụng nhẹ hơn và code sạch sẽ hơn rất nhiều.

5. Phân biệt install vs update (Nỗi đau của người mới)

  • composer install: Dùng khi deploy hoặc khi đồng nghiệp vừa update thư viện mới. Nó ưu tiên file .lock. Hãy luôn dùng lệnh này nếu bạn không muốn làm hỏng hệ thống của người khác.
  • composer update: Dùng khi bạn chủ động muốn nâng cấp thư viện lên bản mới nhất (trong phạm vi cho phép của .json). Lệnh này sẽ tính toán lại và ghi đè file .lock. Cẩn thận: Lệnh này có thể gây ra breaking changes nếu thư viện mới không tương thích ngược.

Lời kết

Composer đã thay đổi hoàn toàn cách chúng ta viết PHP, đưa nó từ một ngôn ngữ "chắp vá" trở thành một hệ sinh thái chuyên nghiệp và mạnh mẽ. Hiểu được cách nó quản lý thư viện và cơ chế autoload sẽ giúp bạn tự tin hơn khi xử lý các lỗi hệ thống phức tạp.

Hy vọng bài viết này giúp anh em bớt "sợ" mỗi khi nhìn thấy file composer.lock dài dằng dặc. Hẹn gặp lại anh em trong các bài viết chia sẻ kiến thức backend tiếp theo!


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.