Quay lại
Hiểu về composer trong Laravel

Composer là Gì

Composer là một công cụ quản lý package (package) cho PHP, và nó được sử dụng rộng rãi trong Laravel và nhiều dự án PHP khác. Dưới đây là một số khái niệm cơ bản và cách Composer được sử dụng trong Laravel:

  1. Composer là Gì:

    • Composer là một công cụ quản lý package cho PHP, giúp quản lý các thư viện và dependencies của dự án PHP.
    • Nó sử dụng một tệp composer.json để mô tả các dependencies và cấu hình của dự án.
  2. Tệp composer.json:

    • Tệp composer.json định nghĩa các thông tin về dự án, bao gồm tên dự án, tác giả, phiên bản PHP yêu cầu, và danh sách các dependencies.
    • Cài đặt và cập nhật dependencies được thực hiện thông qua Composer.
  3. Cài Đặt Dependencies:

    • Khi bạn tạo một dự án Laravel mới, bạn sẽ thấy một tệp composer.json được tạo ra sẵn với các dependencies cần thiết.

    • Để cài đặt các dependencies, chạy lệnh sau trong thư mục dự án:

      composer install​
  4. Cập Nhật Dependencies:

    • Khi bạn muốn cập nhật các dependencies của dự án, chạy lệnh:

      composer update​
    • Lệnh này sẽ kiểm tra các phiên bản mới nhất của các dependencies và cập nhật tệp composer.lock.

  5. Autoloading:

    • Composer tạo ra một tệp vendor/autoload.php để autoloading các classes từ các thư viện được cài đặt.
    • Trong Laravel, autoloading này được sử dụng tự động để load các classes mà bạn sử dụng trong dự án.
  6. Sử Dụng Laravel và Composer Cùng Nhau:

    • Laravel sử dụng Composer để quản lý dependencies của nó.
    • Bạn có thể thấy rằng khi tạo một dự án Laravel mới, Composer sẽ được sử dụng để cài đặt các dependencies như Laravel Framework, Eloquent ORM, và các thư viện khác.
  7. Composer và Laravel Forge:

    • Laravel Forge là một dịch vụ quản lý máy chủ được thiết kế đặc biệt cho Laravel. Forge sử dụng Composer để quản lý các dependencies trên máy chủ.
  8. Tự Định Nghĩa package (Package):

    • Bạn có thể định nghĩa và sử dụng các package tùy chỉnh của mình trong Laravel, và Composer sẽ giúp bạn quản lý những package này.

Phân biệt composer.json và composer.lock

Trong Laravel và nhiều dự án PHP khác, composer.jsoncomposer.lock là hai tệp quan trọng liên quan đến Composer, công cụ quản lý package (package) PHP.

  1. composer.json:

    • Tệp composer.json chứa thông tin mô tả về dự án và các dependencies của nó.

    • Dưới đây là một ví dụ đơn giản về nội dung của composer.json:

      {
          "name": "your/awesome-laravel-app",
          "description": "A description of your awesome Laravel app",
          "require": {
              "laravel/framework": "^8.0",
              // ... other dependencies
          },
          "autoload": {
              "psr-4": {
                  "App\\": "app/"
              }
          },
          // ... other configuration
      }​
    • Trong ví dụ trên, nó mô tả tên dự án, mô tả, và các dependencies cần thiết (ví dụ: Laravel Framework). Phiên bản của Laravel được yêu cầu phải là từ 8.0 trở lên (^8.0).

    • Khi bạn cần thêm hoặc cập nhật một dependency, bạn chỉnh sửa tệp composer.json và sau đó chạy composer install hoặc composer update để cài đặt hoặc cập nhật các dependencies.

    • Như trong đoạn code trên thì các bạn có thấy một config json autoload chắc hẳn các bạn đã sử dụng nó để config những file helper hay một số tính năng khác vậy ý nghĩa của nó như thế nào?
    • Trong Composer, autoload là một phần quan trọng của tệp composer.json và được sử dụng để định nghĩa cách mà Composer sẽ tìm và tải các file class (lớp) trong dự án PHP của bạn. Nó giúp bạn tự động tải các class khi chúng được sử dụng trong mã của bạn mà không cần phải require() hay include() chúng một cách thủ công.

      Phần autoload trong tệp composer.json có thể bao gồm các khối như psr-4, psr-0, classmap, và files, tùy thuộc vào cách bạn muốn tổ chức mã của mình.

      Dưới đây là một ví dụ về cấu trúc autoload trong tệp composer.json:

      {
          "autoload": {
              "psr-4": {
                  "Namespace\\": "src/"
              },
              "classmap": [
                  "app/Class1.php",
                  "app/Class2.php"
              ],
              "files": [
                  "app/functions.php"
              ]
          }
      }​
      • Phần "psr-4" định nghĩa một namespace và một đường dẫn base, giúp Composer tự động tìm và tải các file class trong namespace đó từ đường dẫn cụ thể.

      • Phần "classmap" định nghĩa danh sách các file class cần được tải.

      • Phần "files" định nghĩa danh sách các file cần được include trực tiếp.

      Khi bạn chạy composer install hoặc composer update, Composer sẽ đọc phần autoload và tạo ra một file autoloader (chẳng hạn như vendor/autoload.php) để giúp PHP tìm và tải các class một cách tự động khi chúng được sử dụng trong mã của bạn.

  2. composer.lock:

    • Tệp composer.lock chứa thông tin chi tiết về các phiên bản cụ thể của các dependencies và các dependencies của chúng.

    • Khi bạn chạy lệnh composer install, Composer sẽ đọc tệp composer.lock để đảm bảo rằng nó cài đặt các phiên bản cụ thể đã được kiểm soát từ lần cài đặt trước đó.

    • Điều này giúp đảm bảo rằng tất cả các thành viên trong dự án sử dụng các phiên bản giống nhau của các dependencies, tránh tình trạng mất đồng bộ.

    • Khi bạn chạy lệnh composer install, Composer sẽ sử dụng tệp composer.lock để cài đặt các phiên bản cụ thể. Nếu bạn chạy composer update, Composer sẽ cập nhật tệp composer.lock với các phiên bản mới nhất và cài đặt chúng.

    • Việc sử dụng tệp composer.lock giúp đảm bảo tính nhất quán về phiên bản giữa các môi trường, như môi trường phát triển và môi trường triển khai (production).

Nhớ rằng bạn không nên thay đổi tệp composer.lock trực tiếp, vì Composer sẽ quản lý nó dựa trên thông tin trong tệp composer.json và các thay đổi trong các lần chạy composer install và composer update.

require với require-dev có gì giống và khác nhau

Trong file composer.json, phần requirerequire-dev đều được sử dụng để chỉ định các gói phụ thuộc mà dự án của bạn cần để chạy đúng cách, tuy nhiên chúng có một số điểm giống và khác nhau:

Giống nhau:

  1. Đều chỉ định các gói phụ thuộc: Cả require và require-dev đều dùng để chỉ định các gói mà dự án của bạn phụ thuộc vào.
  2. Dùng cùng một định dạng: Cả hai đều sử dụng định dạng JSON để chỉ định danh sách các gói phụ thuộc.

Khác nhau:

  1. Mục đích sử dụng:

    • require: Sử dụng để chỉ định các gói phụ thuộc cần thiết để chạy ứng dụng hoặc thư viện của bạn. Những gói được chỉ định trong phần này là những gói cần thiết để ứng dụng hoạt động.
    • require-dev: Sử dụng để chỉ định các gói phụ thuộc chỉ cần thiết trong quá trình phát triển và kiểm thử ứng dụng của bạn. Những gói được chỉ định trong phần này thường là các công cụ hoặc thư viện hỗ trợ cho quá trình phát triển như các gói kiểm thử, các công cụ debugging, hoặc các thư viện mô phỏng dữ liệu.
  2. Quản lý phụ thuộc:

    • require: Các gói được chỉ định trong phần này sẽ được Composer cài đặt cả khi bạn chạy lệnh composer install và composer update.
    • require-dev: Các gói được chỉ định trong phần này chỉ được cài đặt khi bạn chạy lệnh composer install với tùy chọn --dev, hoặc khi bạn cài đặt dự án từ một tập tin composer.lock có chứa phần require-dev.
  3. Môi trường sử dụng:

    • require: Các gói trong phần này cần được cài đặt trong môi trường production.
    • require-dev: Các gói trong phần này chỉ cần được cài đặt trong môi trường development hoặc khi bạn cần chạy các tác vụ phát triển và kiểm thử.

Tóm lại, require được sử dụng để chỉ định các gói phụ thuộc cần thiết để chạy ứng dụng, trong khi require-dev được sử dụng để chỉ định các gói phụ thuộc chỉ cần thiết trong quá trình phát triển và kiểm thử.

Hiểu các package version trong Laravel

Trong tệp composer.json của một dự án PHP, khi bạn đặt yêu cầu về phiên bản PHP, dạng ^7 nghĩa là bạn muốn sử dụng một phiên bản PHP từ 7.0 trở lên nhưng không bao gồm các phiên bản chính thức của PHP 8.0. Cụ thể:

  • ^7.0.0: Nghĩa là sử dụng bất kỳ phiên bản PHP nào bắt đầu từ 7.0.0 và không bao gồm bất kỳ phiên bản nào sau PHP 7.

Nói chung, đây là cách Composer quản lý các yêu cầu về phiên bản:

  • ^ (caret) cho biết "compatible with". Ví dụ, ^7 có nghĩa là tương thích với bất kỳ phiên bản nào bắt đầu từ 7, nhưng không tương thích với PHP 8.
  • ~ (tilde) cũng có ý nghĩa tương tự nhưng giới hạn chỉ đến phiên bản cuối cùng của một phiên bản nhỏ (ví dụ: ~7.4 sẽ tương thích với bất kỳ phiên bản nào bắt đầu từ 7.4 và không bao gồm 8.0).

Nếu bạn muốn tương thích với bất kỳ phiên bản nào, kể cả PHP 8, bạn có thể đặt "php": "*" trong composer.json. Tuy nhiên, điều này có thể gây ra vấn đề nếu mã nguồn của bạn không tương thích với một số thay đổi trong PHP 8.

 
 

Bình luận (1)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Michael Gough   Đinh Hải

ok day

Jese LeosNo Name

Ok

Bài viết liên quan

Learning English Everyday