Composer là trình quản lý package cho PHP. Chạy composer require vendor/package trong thư mục dự án: Composer tải thư viện vào vendor/, ghi nó vào composer.json, và bạn nạp thư viện đó, cùng mọi thứ khác đã cài, chỉ bằng một dòng require __DIR__ . '/vendor/autoload.php';.
composer require monolog/monolog
<?php
require __DIR__ . '/vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Level;
$log = new Logger('app');
$log->pushHandler(new StreamHandler(__DIR__ . '/app.log', Level::Warning));
$log->warning('Disk almost full', ['free' => '2%']);
Không cần include cho từng tệp: autoloader nạp Logger, StreamHandler và mọi thứ chúng dùng vào lần đầu mỗi class được cần đến. Package được lấy từ Packagist, kho package công khai mà Composer tìm kiếm mặc định.
Cài đặt Composer
Composer cần có PHP trên máy trước (xem cài đặt PHP).
Windows: tải và chạy Composer-Setup.exe từ getcomposer.org. Trình cài đặt tự tìm php.exe và thêm composer vào PATH. Sau đó mở một terminal mới.
macOS với Homebrew:
brew install composer
Linux: package của bản phân phối (sudo apt install composer trên Debian và Ubuntu) dùng được nhưng thường là bản cũ. Trình cài đặt chính thức cho bạn bản mới nhất:
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
sudo mv composer.phar /usr/local/bin/composer
Trang tải về trên getcomposer.org còn có một dòng lệnh kiểm tra mã hash của trình cài đặt trước khi chạy; hãy sao chép các lệnh từ đó để có mã hash hiện tại. Sau đó kiểm tra xem Composer đã chạy được chưa:
composer --version
composer.json và composer.lock
composer init hỏi vài câu rồi ghi ra composer.json, hoặc composer require tự tạo tệp này khi bạn cài package đầu tiên. Một tệp điển hình:
{
"name": "acme/shop",
"require": {
"php": ">=8.2",
"monolog/monolog": "^3.0",
"vlucas/phpdotenv": "^5.6"
},
"require-dev": {
"phpunit/phpunit": "^11.0"
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
requireliệt kê những gì dự án cần để chạy, kể cả phiên bản PHP.require-devliệt kê các công cụ chỉ dùng khi phát triển (kiểm thử, phân tích tĩnh).composer require --dev phpunit/phpunitthêm vào mục này, còncomposer install --no-devbỏ qua nó trên máy chủ production.autoloadcho Composer biết class của bạn nằm ở đâu (xem bên dưới).
Bên cạnh đó, Composer ghi ra composer.lock với phiên bản chính xác của mọi package đã cài, kể cả những package mà các package của bạn phụ thuộc vào. Hãy commit cả hai tệp. Đừng commit vendor/: thêm nó vào .gitignore, vì composer install dựng lại thư mục này từ tệp lock.
composer install và composer update
composer install # install exactly what composer.lock says
composer update # pick the newest allowed versions, rewrite composer.lock
composer update monolog/monolog # update one package only
composer remove monolog/monolog # uninstall and remove from composer.json
composer outdated # list packages with newer versions available
Chạy composer install sau khi clone một dự án và mỗi lần triển khai: ai cũng có đúng các phiên bản đã được kiểm thử. Chỉ chạy composer update khi bạn định nâng cấp, sau đó kiểm thử và commit composer.lock mới. Chạy update trên máy chủ production sẽ cài những phiên bản chưa ai kiểm thử.
Ràng buộc phiên bản: ^ và ~
| Ràng buộc | Cho phép | Dùng khi |
|---|---|---|
^3.2 | từ 3.2.0 đến trước 4.0.0 | Lựa chọn thông thường: có tính năng và bản sửa lỗi, không có phiên bản lớn gây lỗi |
^0.4 | từ 0.4.0 đến trước 0.5.0 | Package chưa đến 1.0, khi phiên bản nhỏ có thể gây lỗi |
~3.2 | từ 3.2.0 đến trước 4.0.0 | Giống ^3.2 |
~3.2.1 | từ 3.2.1 đến trước 3.3.0 | Chỉ nhận bản sửa lỗi |
3.2.1 | Đúng 3.2.1 | Hiếm khi dùng; nó chặn các bản vá bảo mật |
>=3.2 <3.5 | Một khoảng tùy chỉnh | Né một bản phát hành bị lỗi |
composer require vendor/package không kèm phiên bản sẽ chọn bản ổn định mới nhất và ghi ràng buộc ^ cho nó, thường là đúng thứ bạn cần.
Autoload class của bạn với PSR-4
PSR-4 là quy ước ánh xạ một namespace tới một thư mục: với "App\\": "src/", class App\Text\Slug nằm trong src/Text/Slug.php. Sau khi thêm mục autoload, chạy:
composer dump-autoload
Autoloader của Composer là một hàm được đăng ký bằng spl_autoload_register(), PHP gọi nó mỗi khi code dùng một class chưa được nạp. Khối code này ghi ra hai tệp class và đăng ký một autoloader PSR-4 nhỏ của riêng nó, để bạn thấy phép ánh xạ hoạt động. Hãy thêm một tệp class thứ ba và dùng thử.
Autoloader chạy một lần cho mỗi class: lời gọi Slug::from() thứ hai không in ra dòng autoload: nào, vì class đã được nạp. Trong dự án thật, bạn không bao giờ tự viết hàm này; vendor/autoload.php đăng ký phiên bản của Composer, phiên bản đó còn xử lý cả các package trong vendor/. Namespace được trình bày ở trang namespace.
Các lỗi thường gặp
Class "Monolog\Logger" not found. Script chưarequire 'vendor/autoload.php', hoặc đường dẫn sai. Dùng__DIR__ . '/vendor/autoload.php'để đường dẫn không phụ thuộc vào thư mục hiện tại.- Không tìm thấy class của bạn sau khi đã thêm vào
autoload. Chạycomposer dump-autoload, và kiểm tra đường dẫn tệp có khớp chính xác với namespace không, kể cả chữ hoa và chữ thường:App\Text\Slugphải làsrc/Text/Slug.php, và máy chủ Linux coisrc/text/slug.phplà một tệp khác. Your requirements could not be resolved to an installable set of packages. Hai package cần những phiên bản không tương thích của cùng một thứ, thường là chính PHP. Thông báo lỗi liệt kê xung đột;composer why-not vendor/package 2.0giải thích điều gì đang chặn một phiên bản.- Không nhận ra lệnh
composer. Terminal được mở trước khi cài, hoặc thư mục chưa có trong PATH. Mở một terminal mới, hoặc gọi trực tiếpphp composer.phar.
Câu hỏi thường gặp
composer install và composer update khác nhau thế nào?
composer install cài đúng các phiên bản đã ghi trong composer.lock, nên máy nào cũng có cùng một code; chạy lệnh này sau khi clone và khi triển khai. composer update tìm các phiên bản mới nhất mà composer.json cho phép, cài chúng và ghi lại composer.lock; chạy lệnh này khi bạn thật sự muốn nâng cấp.
Có nên commit composer.lock và thư mục vendor không?
Với ứng dụng, hãy commit composer.lock để mọi người cài cùng các phiên bản. Đừng commit vendor/: thêm nó vào .gitignore và để composer install tạo lại.
Dấu ^ trong composer.json nghĩa là gì?
^2.3 cho phép mọi phiên bản từ 2.3.0 đến trước 3.0.0: có tính năng mới và bản sửa lỗi, nhưng không có phiên bản lớn mới có thể làm hỏng code của bạn. ~2.3 có nghĩa tương tự, còn ~2.3.1 chỉ cho phép 2.3.x từ 2.3.1 trở lên.
Làm sao autoload class của chính mình bằng Composer?
Thêm "autoload": {"psr-4": {"App\\": "src/"}} vào composer.json, chạy composer dump-autoload, rồi require 'vendor/autoload.php'. Khi đó class App\Mail\Mailer được nạp từ src/Mail/Mailer.php vào lần đầu bạn dùng đến nó.
Làm sao kiểm tra phiên bản Composer đang cài?
Chạy composer --version. Để nâng cấp chính Composer, chạy composer self-update, hoặc nâng cấp qua trình quản lý package bạn đã dùng để cài, chẳng hạn brew upgrade composer.