Composer là gì?
Composer là một công cụ quản lý các Dependency
(bạn có thể hiểu là các thư viện mà chỉ dự án của bạn sử dụng - không dùng bởi nhiều dự án) trong PHP. Vậy Composer
quản lý thư viện dựa trên từng Project PHP riêng biệt của bạn, nó cài đặt các thư viện này vào một thư mục có tên vendor
trong dự án (mỗi dự án có một thư mục vendor
). Composer tự động sinh ra file vendor/autoload.php
, từ file này giúp bạn
nạp các thư viện đã cài đặt (Nó áp dụng cơ chế tự động nạp theo chuẩn
PSR-4 Autoloader) và cả PSR-0
(lỗi thời).
Lợi ích khi sử dụng Composer
Nói chung là các dự án PHP ngày nay là không thể thiếu Composer, vì chúng thường sử dụng rất nhiều loại thự viện. Nếu cài đặt thư viện thủ công thật sự là ác mộng (tích hợp, cập nhật cực cừ mệt mỏi). Khi có Composer dùng thư viện nào chỉ việc khai báo hay gõ tích hợp, khi cập nhật thự viện nào đó, nó cũng tự động giúp bạn cập nhật luôn các thư viện khác mà thư viện cập nhật dùng tới.
Cài đặt Composer
Composer được viết bằng PHP
mã đóng gói dạng PHAR
, nên muốn dùng
Composer phải chắc chắn máy đã cài đặt PHP. Từ terminate
gõ lệnh sau kiểm tra xem máy có PHP hay chưa, nếu
chưa có bạn phài cài PHP trước (xem Cài đặt PHP)
# php -v PHP 5.6.25 (cli) (built: Aug 18 2016 11:39:15) Copyright (c) 1997-2016 The PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
Cài đặt Composer trên Windows
Tải Composer-Setup.exe và chạy nó, thật đơn giản.
Sau khi cài đặt, để gọi được lệnh Composer ở bất kỳ đâu (dù đứng ở thư mục nào) thì thêm vào hệ thống Windows, giá
trị C:\ProgramData\ComposerSetup\bin
vào biến môi trường PATH
Cài đặt Composer trên CentOS/RHEL/Ubuntu
# sudo curl -sS https://getcomposer.org/installer | php # Để gọi được Composer ở bất kỳ đâu # mv composer.phar /usr/local/bin/composer
Kiểm tra Composer và vài lệnh tổng quan
Từ dòng lệnh terminate
gõ cách lệnh:
#Kiểm tra phiên bản Composer # composer -v Composer version 1.8.0 2018-12-03 10:31:16 #Cập nhật Composer # composer -selfupdate #Xóa cache composer | xóa đi các thư viện tải sẵn trong cache, để bắt nó tải lại # composer clearcache #Tìm các gói thưu viện # composer search từ_tìm_kiếm
Khi chạy các lệnh Composer cho từng dự án, bạn chạy trên dòng lệnh terminate
,
bắt buộc chyển đến folder chứa dự án để chạy bằng lệnh cd
.
Sử dụng Composer cơ bản trong dự án PHP
Composer cho một dự án mới
Mọi thiết lập Composer cho dự án đều chứa trong file composer.json
, nếu chưa có file này cho dự án thì bắt
đầu khởi tạo như sau:
# Composer int
Sau lệnh này nó yêu cầu bạn nhập một số thông tin của dự án, hãy nhập thông tin của bạn vào
Package name (<vendor>/<name>) [xt/xt]: xtlab/myproject01 Description []: Day la du an PHP Author [XTLAB <xtl@xuanthulab.net>, n to skip]: XUANTHULAB <xuanthulab.net@gmail.com> Minimum Stability []: beta Package Type (e.g. library, project, metapackage, composer-plugin) []: License []: Define your dependencies. Would you like to define your dependencies (require) interactively [yes]? no Would you like to define your dev dependencies (require-dev) interactively [yes]?no Do you confirm generation [yes]? y
Sau khi nhập thông tin về dự án của bạn như trên xong, Composer đã sinh ra file composer.json
{ "name": "xtlab/myproject01", "description": "Day la du an PHP", "authors": [ { "name": "XUANTHULAB", "email": "xuanthulab.net@gmail.com" } ], "minimum-stability": "beta", "require": {} }
Sau này, bạn các tùy biến, thiết lập, tích hợp thư viện trên dự án của bạn sẽ tự động cập nhật vào file này!
Tích hợp thư viện vào dự án bằng Composer
Trước hết xác định xem dự án của bạn cần thư viện nào, tìm tại https://packagist.org/
Ví dụ, bạn muốn sử dụng thư viện monolog/monolog phiên bản mới nhất (thư viện lưu log thông dụng cho php), thì từ dòng lệnh gõ
# composer require monolog/monolog
Sau lệnh này, Composer sẽ tải tất cả các thành phần để dùng được thư viện monolog/monolog
vào dự án của bạn,
nó lưu tại vendor
, đồng thời cũng có luôn file vendor/autoload.php
Mở lại file composer.json
bạn thấy đã có thêm đoạn mã:
{ "require": { "monolog/monolog": "^1.24" } }
Điều này cho biết, dự án bạn dùng thư viện nào, sau này bạn chia sẻ dự án (copy dự án đi cho khác) bạn không cần phải
copy cả thư mục vendor
, mà chỉ cần file composer.json
, composer sẽ cập nhật lại vendor cho bạn.
Ngoài cách gõ lệnh như trên, bạn cũng có thể viết thư viện cần dùng vào composer.json
rồi gọi lệnh:
# composer update
Nó cũng sẽ kiểm tra và cài đặt tất cả các thư viện cần thiết nếu chưa có. Ví dụ, giờ bạn lại muốn dùng thêm thư viên filp/whoops, phiên bản 2.3.1 (thư viện chuyên hiện thị thông báo lỗi đẹp mắt - tiện dụng để debug).
Thay vì cách gõ lệnh như trên, bạn sẽ chỉnh sửa composer.json
thêm vào nội dung phần require
nội
dung mô tả thư viện whoops: "tên-thư-viện":"^phiên-bản-nhỏ-nhất"
{ "require": { "monolog/monolog": "^1.24", "filp/whoops": "^2.3.1" } }
Sau đó gõ lệnh composer update
, để cài đặt thư viện. Với cách này bạn có thể liệt kê tất cả các thư viện
cần dùng, rồi gõ một lệnh để cài đặt.
Như trên đã nói, Composer
sinh ra file vendor/autoload.php
, bạn chỉ việc include
,
là có thể sử dụng các thư viện.
Ví dụ, sử dụng thư viện monolog/monolog
ở trên trong file index.php
<php? include vendor/autoload.php'; use Monolog\Logger; use Monolog\Handler\StreamHandler; $log = new Logger('name'); $log->pushHandler(new StreamHandler('mylogfile.log', Logger::WARNING)); $log->warning('ghi log'); $log->error('ghi log abc');
Xóa thư viện khỏi dự án
Nếu một thư viện nào đã tích hợp vào dự án (vendor
) mà giờ không muốn dùng đến nữa,
thì loại bỏ bằng 1 trong hai cách sau:
Cách 1 - Gõ lệnh composer
# composer remove vendor/package
Ví dụ, không muốn dùng đến filp/whoops
thì gõ:
# composer remove filp/whoops
Sau lệnh này, nó sẽ xóa thư viện ra khỏi vendor
, cập nhật lại vendor/autoload.php
, composer.json
, đảm bảo thư viện không còn tồn tại!
Cách 2 - Cập nhật composer.json
Muốn loại bỏ thư viện nào, mở file composer.json
, xóa tên thư viện đó trong phần require
,
cuối cùng gõ lệnh
# composer update
Composer và PSR-4 : Autoload
Xem thêm trong : PSR-4: Autoload
Như đã biết các thư viện hiện này, và code của bạn sau này được khuyến khích xây dựng sao cho đáp ứng cơ chế
tự động nạp theo chuẩn PRS-4
.
Tổ chức code của bạn (giống như các thư viện) được đặt tên truy cập được bằng namespace
.
Mỗi module dự án của bạn có một cái tên theo cấu trúc vendor/module
Sau đó, để đảm bảo vendor/autoload.php
được gọi, thì ngoài các thư viện, thì nó cũng cấu hình để gọi được
module của bạn, nếu vậy bạn cần cập nhật composer.json
ở thành phần autoload
Ví dụ cụ thể như sau:
Xây dựng một lớp có tên FirstClass
, có namespace
là MyCompany/Mymodule
. Code
file lưu trong file src/Mymodule/FirstClass.php
<?php namespace MyCompany\Mymodule class FirstClass { function helloComposer() { } }
Như trên là đã đúng chuẩn PRS-4
, composer giúp bạn tích hợp vào vendor/autoload.php
, để
có thể tự động include có trên khi cần dùng đến bằng đoạn code ví dụ:
<?php $cls = new MyCompany\Mymodule\FirstClass();
Hoặc
<?php use MyCompany\Mymodule; $cls = new FirstClass();
Để làm được điều đó, bạn hãy cho composer biết bạn có một module chuẩn tự động nạp PRS-4, bằng đoạn mã sau trong
composer.json
.
{ "autoload": { "psr-4": { "MyCompany\\": "src/", } } }
Điều đó có nghĩa là namespace
cấp 1 - MyCompany
sẽ trỏ đến thư mục src/
,
bắt đầu từ cấp tiếp theo sẽ trỏ theo cấu trức thư mục này. MyCompany\Mymodule\FirstClass
thì tương ứng ở
vị trí src/Mymodule/FirstClass.php
Khai báo composer.json
như trên xong, gõ lệnh:
# composer dum-autoload
Giờ thì vendor/autoload.php
có cơ chế để tự động nạp code của bạn khi dùng đến!
Đưa thư viện lưu trên Packagist
Nếu bạn có một thư viện, muốn lưu trên https://packagist.org/, để mọi người có thể cài vào dự án của họ bằng Composer thì làm thế nào?
Đây là các bước làm
- Phát triển thư viện, có file
composer.json
rõ ràng - Bạn sử dụng git để commit thư viện của bạn, sau khi hoàn thành push toàn bộ lên một server, chẳng hạn github (Bạn phải biết về GIT và GITHUB)
- Đăng ký một tài khoản trên
https://packagist.org/
, đăng nhập vào, rồi bào mục Submit. Đơn giản là dán đường link của github đến dự án của bạn, nhấn Check! Thế là xong
Bây giờ thực hiện thử đăng một thư viện, các bước làm từ đầu.
(1) Code PHP thư viện
Ví dụ đơn giản này, sẽ tạo một thư viện có chức năng Convert chữ tiếng việt có dấu sang dạng không dấu (Ví dụ Xin Chào
thành xin chao
)
Thư viện sẽ đặt tên như sau: chọn tên vendor là XuanthuLab
(sẽ dùng làm namespace cấp 1), thư viện lưu ở thư mục src/
,
trong thư mục này tạo ra thư mục Tools
, trong đó có file php src/Tools/Convert.php
với nội dung là xây dựng một lớp
Convert như sau:
<?php namespace XuanthuLab\Tools; class Convert { public static $decomposed = ["à","á","ạ","ả","ã","â","ầ","ấ","ậ","ẩ","ẫ","ă", "ằ","ắ","ặ","ẳ","ẵ","è","é","ẹ","ẻ","ẽ","ê","ề" ,"ế","ệ","ể","ễ", "ì","í","ị","ỉ","ĩ", "ò","ó","ọ","ỏ","õ","ô","ồ","ố","ộ","ổ","ỗ","ơ" ,"ò","ớ","ợ","ở","õ", "ù","ú","ụ","ủ","ũ","ư","ừ","ứ","ự","ử","ữ", "ỳ","ý","ỵ","ỷ","ỹ", "đ", "À","À","Ạ","Ả","Ã","Â","Ầ","Ấ","Ậ","Ẩ","Ẫ","Ă" ,"Ằ","Ắ","Ặ","Ẳ","Ẵ", "È","É","Ẹ","Ẻ","Ẽ","Ê","Ề","Ế","Ệ","Ể","Ễ", "Ì","Í","Ị","Ỉ","Ĩ", "Ò","Ó","Ọ","Ỏ","Õ","Ô","Ồ","Ố","Ộ","Ổ","Ỗ","Ơ" ,"Ờ","Ớ","Ợ","Ở","Ỡ", "Ù","Ú","Ụ","Ủ","Ũ","Ư","Ừ","Ứ","Ự","Ử","Ữ", "Ỳ","Ý","Ỵ","Ỷ","Ỹ", "Đ"]; public static $precomposed = ["à","á","ạ","ả","ã","â","ầ","ấ","ậ","ẩ","ẫ","ă", "ằ","ắ","ặ","ẳ","ẵ","è","é","ẹ","ẻ","ẽ","ê","ề" ,"ế","ệ","ể","ễ", "ì","í","ị","ỉ","ĩ", "ò","ó","ọ","ỏ","õ","ô","ồ","ố","ộ","ổ","ỗ","ơ" ,"ờ","ớ","ợ","ở","ỡ", "ù","ú","ụ","ủ","ũ","ư","ừ","ứ","ự","ử","ữ", "ỳ","ý","ỵ","ỷ","ỹ", "đ", "À","Á","Ạ","Ả","Ã","Â","Ầ","Ấ","Ậ","Ẩ","Ẫ","Ă" ,"Ằ","Ắ","Ặ","Ẳ","Ẵ", "È","É","Ẹ","Ẻ","Ẽ","Ê","Ề","Ế","Ệ","Ể","Ễ", "Ì","Í","Ị","Ỉ","Ĩ", "Ò","Ó","Ọ","Ỏ","Õ","Ô","Ồ","Ố","Ộ","Ổ","Ỗ","Ơ" ,"Ờ","Ớ","Ợ","Ở","Ỡ", "Ù","Ú","Ụ","Ủ","Ũ","Ư","Ừ","Ứ","Ự","Ử","Ữ", "Ỳ","Ý","Ỵ","Ỷ","Ỹ", "Đ"]; public static $latin = ["a","a","a","a","a","a","a","a","a","a","a" ,"a","a","a","a","a","a", "e","e","e","e","e","e","e","e","e","e","e", "i","i","i","i","i", "o","o","o","o","o","o","o","o","o","o","o","o" ,"o","o","o","o","o", "u","u","u","u","u","u","u","u","u","u","u", "y","y","y","y","y", "d", "a","a","a","a","a","a","a","a","a","a","a","a" ,"a","a","a","a","a", "e","e","e","e","e","e","e","e","e","e","e", "i","i","i","i","i", "o","o","o","o","o","o","o","o","o","o","o","o" ,"o","o","o","o","o", "u","u","u","u","u","u","u","u","u","u","u", "y","y","y","y","y", "d"]; public static function convertLatin($str) { $str = str_replace(self::$decomposed, self::$latin, str_replace(self::$precomposed, self::$latin, $str)); return mb_strtolower($str); } }
(2) Cấu hình Composer
Chạy lệnh khởi tạo composer và nhập các thông tin cần thiết để có được file composer.json
# Composer int
Giả sử thư viện này yêu cầu cài đặt một thư viện khác ví dụ monolog/monolog
, chạy lệnh:
# composer require monolog/monolog
Mở composer.json
ra, thêm vào autoload PSR-4 cho thư viện của bạn, bằng đoạn code
"autoload": { "psr-4": { "XuanthuLab\\": "src/" } }
File composer cuối cùng như sau
{ "name": "xuanthulabnet/latinurl", "description": "Convert VietNam Url", "authors": [ { "name": "XTLAB", "email": "xuanthulab.net@gmail.com" } ], "require": { "monolog/monolog": "^1.24" }, "autoload": { "psr-4": { "XuanthuLab\\": "src/" } } }
(3) Tạo một Repo GitHub để lưu code dự án
Đơn giản, bạn đăng ký một tài khoản GitHub, tạo ra một Repo để lưu code. Mình đã tạo một Repo trên GitHub https://github.com/xuanthulabnet/latinurl để lưu dự án này.
và địa chỉ git là git@github.com:xuanthulabnet/latinurl.git
Sử dụng GitHub như thế nào, làm thế nào để truy cập GitHub từ SSH hãy tham khảo tại: SỬ DỤNG GITHUB
(4) Tạo Git Local Repo cho dự án và push lên GitHub
(Bạn cần biết Sử dụng Git trước) Thực hiện các lệnh git sau từ terminate
# Khởi tạo Local Repo # git init # Chuẩn bị commit # git add . # git add -A # Thực hiện commit # git commit -m'Init' # Tạo 1 tag, đánh dấu phiên bản (Ví dụ V1.0.0) # git tag v1.0.0 # Thêm remote vào local # git remote add origin git@github.com:xuanthulabnet/latinurl.git # Push tất cả lên GitHub # git push --all # git push --tag
Đến đây, tất cả code đã được chuyển lưu trên GitHub ở địa chỉ https://github.com/xuanthulabnet/latinurl
(5) Submit vào Packagist
Bạn đăng nhập vào Packagist, sau đó bấm vào Submit
Dán địa chỉ GitHub của dự án https://github.com/xuanthulabnet/latinurl
vào hộp Repository URL (Git/Svn/Hg)
,
bấm nút Check
, chờ một chút là thư viện của bạn được chuyển vào Packagist
Dự án trên sau khi submit, đã có tại địa chỉ xuanthulabnet/latinurl
Giờ muốn tích hợp vào dự án bất kỳ, chỉ việc gõ:
# composer require xuanthulabnet/latinurl
Bạn hãy thử kiểm tra xem thư viện trên tải về như thế nào, nó sẽ nằm trong vendor
của bạn, dễ dàng sử dụng
với namespace XuanthuLab\Tools\Convert
Chúc thành công!