Cách Sử Dụng Composer Và Autoload Trong Php
Khi thực hiện một dự án làm việc với PHP, các developer thường phải quản lý rất nhiều thư viện từ các bên thứ ba. Việc cài đặt và cập nhật các thư viện này khá phức tạp và rắc rối. Để giải quyết vấn đề này, bạn có thể sử dụng Composer và Autoload để tiết kiệm thời gian và công sức.
Composer là một công cụ (Dependency Management) trong PHP. Nói một cách đơn giản hơn thì Composer dùng để .
Composer cho phép khai báo các thư viện mà dự án PHP mà bạn đang dùng và tự động tải code của các thư viện, tạo và thêm các file cần thiết vào dự án PHP và cập nhật các thư viện khi có phiên bản mới.
Nếu không dùng Composer, khi triển khai các dự án PHP, bạn sẽ gặp phải khá nhiều khó khăn trong việc quản lý các thư viện.
Đầu tiên, để sử dụng các thư viện ở ngoài, bạn cần tải chúng và cho vào folder của dự án PHP. Tuy nhiên, .
Bên cạnh đó, sẽ có nhiều trường hợp một số thư viện phụ thuộc vào các thư viện khác. Điều này khiến bởi bạn phải tìm được thư viện gốc. Ví dụ: Thư viện A phụ thuộc vào thư viện B thì nếu thư viện B có phiên bản mới, chúng ta sẽ phải tìm và cập nhật nó tại thư viện A trước.
Tuy nhiên, nhờ có Composer, các vấn đề trên đều có thể được giải quyết dễ dàng!
Composer đem lại cho các developer hai lợi ích chính như sau:
- Giúp developer quản lý tập trung các thư viện của bên thứ ba cũng như các phiên bản của chúng cách đơn giản và nhanh chóng thông qua file
composer.json
. - Tự động tìm và cập nhật các phiên bản mới của những thư viện cần thiết cho dự án PHP.
Cài đặt Composer
Để tải và cài đặt Composer, bạn cần làm như sau:
Đầu tiên, bạn cần phải cài đặt PHP. Để kiểm tra xem máy đã được cài PHP chưa, hãy nhập lệnh sau vào terminal
:
Việc cài đặt Composer trên Windows rất đơn giản và nhanh chóng, bạn chỉ cần tải file chúng tôi về và chạy nó là xong.
Đầu tiên, tìm tới terminal
và nhập vào câu lệnh sau để cài Composer:
Vẫn trong , nhập tiếp câu lệnh này để cho phép gọi lệnh Composer từ bất kỳ đâu:
mv chúng tôi /usr/local/bin/composer
Một số lệnh tổng quan
- Kiểm tra phiên bản hiện tại của Composer:
composer -v
- Cập nhật phiên bản mới nhất của Composer:
composer -selfupdate
- Xóa bộ nhớ Cache của Composer (Để bắt Composer tải lại các thư viện có trong bộ nhớ Cache):
composer clearcache
- Tìm các gói thư viện:
composer search ten_thu_vien
Hướng dẫn sử dụng Composer trong dự án PHP
Đầu tiên, bạn cần tạo file composer.json
. File này chứa tất cả các dữ liệu về thiết lập của Composer cho dự án. Để tạo file, hãy nhập câu lệnh sau vào terminal
:
composer init
Sau đó, bạn cần khai báo file composer.json
như sau:
Package name (/) [admin/my_project]: vendor/myproject (/*ten thu muc chua thu vien/*/) Description []: Su dung composer trong php Author [elightup , n to skip]: elightup1 Minimum Stability []: dev 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
Vậy là xong, file composer.json
của mình đã được tạo với nội dung như sau:
{ "name": "vendor/myproject", "description": "Su dung composer trong php", "authors": [ { "name": "elightup", "email": "elightup@gmail.com" } ], "minimum-stability": "dev", "require": { } }
Từ nay về sau, các thiết lập cho Composer (bao gồm cả thiết lập cho các thư viện) đều sẽ được lưu vào trong file composer.json
này.
terminal
Chẳng hạn, mình muốn sử dụng phiên bản mới nhất của thư viện phpro/grumphp
(thư viện dùng để kiểm tra chất lượng mã nguồn) nên mình sẽ nhập câu lệnh sau vào trong terminal
:
composer require phpro/grumphp
Câu lệnh này sẽ yêu cầu Composer tải về thư viện phpro/grumphp
. Thư viện này được lưu tại file vendor
trong dự án của bạn.
Ngoài ra, file vendor/autoload.php
cũng sẽ được tạo một cách tự động. File này dùng để tự động nạp (autoload) thư viện cho dự án.
Quay trở lại file composer.json
, bạn sẽ thấy trong file có thêm đoạn code sau:
"require": { "phpro/grumphp": "^0.19.1" }
Trong đó:
-
phpro/grumphp
chính là thư viện đang được sử dụng cho dự án. -
0.19.1
là phiên bản hiện tại của thư viện.
composer.json
Thay vì gõ lệnh trực tiếp từ terminal
như cách 1, bạn có thể chỉnh sửa phần mô tả thư viện whoops
trong file composer.json
bằng cách thêm đoạn code với nội dung như sau vào phần require
:
"ten-thu-vien":"^phien-ban-nho-nhat"
Ví dụ mình muốn tích hợp thư viện phpro/grumphp
phiên bản 0.19.1 vào Composer, nên mình sẽ nhập vào phần require
như sau:
"require": { "phpro/grumphp": "^0.19.1", }
Sau đó, gõ tiếp lệnh composer update
để cài đặt thư viện. Câu lệnh này cũng sẽ tự động cập nhật phiên bản mới nhất của một số thư viện cần thiết cho dự án.
Ưu điểm của cách thứ hai này là bạn có thể liệt kê tất cả các thư viện trước khi nhập vào lệnh composer update
. Vậy nên cách này sẽ rất tiện nếu bạn cần cài nhiều thư viện cùng lúc.
Để sử dụng các thư viện đã được tích hợp trên cho dự án, bạn chỉ cần nhập lệnh include vendor/autoload.php
vào file index.php
trong dự án là được.
composer
Để xóa một thư viện đã được tích hợp vào dự án (được lưu trong file vendor
), bạn có thể làm theo một trong hai cách sau:
Từ terminal
, nhập vào câu lệnh sau:
composer remove vendor/package
composer.json
Trong đó, vendor/package
là tên thư viện mà bạn muốn xóa. Ví dụ mình muốn xóa thư viện phpro/grumphp
thì câu lệnh sẽ là:
composer remove phpro/grumphp
Đối với cách này, bạn cần vào file composer.json
, tìm tới phần require
và xóa tên thư mục mong muốn (ví dụ như phpro/grumphp
) rồi gõ lệnh composer update
.
Chỉ định phiên bản cho các thư viện trong Composer
Trong một số trường hợp, các developer không cần sử dụng phiên bản mới nhất của thư viện mà chỉ cần dùng một phiên bản nhất định. Để làm điều đó, bạn có thể chỉ định phiên bản cho các thư viện trong Composer bằng 6 phương pháp sau:
Ví dụ: Để chỉ định Composer chỉ được sử dụng các phiên bản đồng thời của thư viện phpro/grumphp
, mình nhập câu lệnh sau vào terminal
:
composer require phpro/grumphp "<0.19,!=0.17"
Trong đó
-
phpro/grumphp
là tên thư viện -
<0.19
là yêu cầu chỉ được dùng các phiên bản nhỏ hơn 0.19 -
!=
là yêu cầu chỉ được dùng các phiên bản khác 0.17 -
,
là biểu diễn của toán tửAND
Phương pháp này dùng để yêu cầu Composer chỉ được sử dụng các phiên bản của thư viện trong khoảng xx.*
Phương pháp này sử dụng toán tử -
để xác định giới hạn. Để dễ hình dung hơn, hãy nhìn vào ví dụ dưới dây.
Dùng toán tử để chỉ định rằng Composer chỉ được dùng các phiên bản hiện tại tính từ số được nhập vào (nhưng không bao gồm chính số đó).
Ví dụ: nhập vào "^0.18.1"
thì Composer sẽ chỉ dùng các phiên bản từ 0.18.1 trở đi (không bao gồm bản 0.18.1)
Khi dùng dev-master
, thư viện của bạn sẽ được chỉ định luôn dùng bản cập nhật mới nhất hiện có. Tuy nhiên, điều này thường đi kèm rủi ro bởi các phiên bản mới có thể chưa được hoàn thiện và còn một số lỗi.
Ví dụ: Để yêu cầu Composer luôn dùng bản cập nhật mới nhất cho thư viện phpro/grumphp
, mình sẽ nhập vào composer require phpro/grumphp "dev-master"
.
Autoload là gì?
Autoload là cách thức tải và sử dụng class (lớp). Ở đâu cần gọi đến các class thì nạp chúng tại thời điểm đó thay vì include tất cả các class ở đầu mỗi file PHP. Như vậy ta không cần tải tất cả các class trong thư viện cho tất các các file PHP.
Như đã nói ở trên, Composer giúp cho việc quản lý các thư viện trở nên thuận tiện và nhanh chóng, và Autoload chính là một công cụ hỗ trợ đắc lực giúp cho Composer quản lý sự phụ thuộc giữa các gói thư viện một cách dễ dàng.
Nguyên lý hoạt động của Autoload
Để hiểu được cách mà Autoload vận hành, bạn cần tìm hiểu về tiêu chuẩn trước. Đây là một tiêu chuẩn viết code PHP được khuyến khích sử dụng cho các thư viện.
Nội dung tiêu chuẩn PSR-4 như sau:
:
-
NameSpace
: Tên củavendor
, là tiền tố buộc phải có và do bạn tự đặt, không được trùng tên cácvendor
khác. -
SubNameSpaces
: Cácnamespace
con (theo saunamespace
đầu tiên -vendor
). Bắt đầu từSubNameSpaces
thì đường dẫn của nó sẽ tương ứng với cấu trúc thư mục lưu trữ code. Ví dụ, bạn lưu trữ code thư viện tại thư mục gốc làsrc
, và gọi đến một lớp của bạn tên làcls1
với cú phápmyvendornamespace1namespace2cls1
điều này có nghĩa là trong thư mụcsrc
có thư mục tên lànamespace1
, trongnamespace1
lại có một thư mục lànamespace2
. -
ClassName
: Đây là tên của class được tạo và buộc phải có. Ngoài ra, bạn cần đặt tên file PHP trùngClassName
ở thư mục tương ứng vớinamespace
cuối cùng (ClassName.php
), file này sẽ định nghĩa nội dung code của class.
Các dự án PHP đều sẽ cần sử dụng một thư viện Autoload để nạp cấu trúc trên khi cần dùng tới. Các framework có cùng cơ chế Autoload sẽ có thể dùng lại những thư viện của nhau. Và các framework PHP hiện nay hầu hết đều dùng cơ chế Autoload theo PSR-4.
cho người dùng. Chính vì vậy, công cụ này có thể giúp bạn .
Ví dụ, mình muốn tạo một class tên là Car
, với namespace
là Vehicle/Listings
. Code của class sẽ được lưu trong file src/Listings/Car.php
. Nội dung của file này như sau:
<?php namespace VehicleListings class Car { function listsCar() { //code... } }
Đoạn code này đã đúng chuẩn PSR-4, vậy nên Composer sẽ giúp bạn tích hợp nó vào file vendor/autoload.php
. Để gọi class này ra khi cần dùng tới, hãy khai báo tới Composer rằng bạn có một module Autoload theo chuẩn PSR-4 bằng cách thêm đoạn code sau vào file composer.json
:
{ "autoload": { "psr-4": { "Vehicle\": "src/", } } }
Đoạn code trên có tác dụng yêu cầu namespace
cấp 1 - Vehicle
trỏ tới thư mục src/
, và các namespace
cấp 2 trở đi cũng sẽ trỏ theo cấu trúc thư mục này. Ví dụ, đường dẫn của class Car
là src/Listings/Car.php
. Trong đó, scr
là file được namespace
1 trỏ về, Listings
là file nằm trong scr
, Car.php
file PHP chứa code của class.
Sau khi khai báo tới Composer xong, hãy nhập vào câu lệnh sau trong terminal
:
composer dump-autoload
Giờ thì vendor/autoload.php
có cơ chế để autoload code của bạn khi cần dùng đến. Từ nay trở đi, nếu muốn dùng class Car
, bạn chỉ cần gọi nó bằng một trong hai đoạn code sau:
Đoạn code thứ nhất:
<?php $cls = new VehicleListingsCar();
Đoạn code thứ hai:
<?php use VehicleListings; $cls = new Car();
Ngoài ra, bạn cũng có thể tham khảo một số bài viết tương tự như " Object Pool Pattern là gì và cách sử dụng trong PHP?" và " Một số mẹo giúp bạn viết code PHP tốt và dễ đọc hơn" trong chuyên mục Coding của tụi mình.