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.

Trong bài viết lần này, hãy cùng đi tìm hiểu về Composer, Autoload và cách sử dụng chúng nhé!

Cách sử dụng Composer và Autoload trong PHP

Composer là gì?

Composer là một công cụ quản lý các thư viện phụ thuộc của dự án (Dependency Management) trong PHP. Nói một cách đơn giản hơn thì Composer dùng để quản lý các thư viện mà dự án PHP của bạn đang sử 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.

Các khó khăn thường gặp phải trong việc quản lý các thư viện

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, quá trình cài đặt này khá phức tạp và khó nhớ.

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 việc cập nhật chúng rất tốn thời gian và công sức 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!

Lợi ích của Composer

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:

Kiểm tra xem máy đã cài PHP chưa

Đầ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:

php -v

Cài đặt Composer trên Windows

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 Composer-Setup.exe về và chạy nó là xong.

Mặc định, Composer sẽ thêm đường dẫn của nó vào biến môi trường PATH của hệ thống để có thể gọi lệnh composer ở bất cứ thư mục nào. Tuy nhiên, nếu bạn không chạy được lệnh composer, hãy thêm giá trị C:\ProgramData\ComposerSetup\bin vào biến môi trường PATH của hệ thống.

Cài đặt Composer trên CentOS/RHEL/Ubuntu

Đầu tiên, tìm tới terminal và nhập vào câu lệnh sau để cài Composer:

sudo curl -sS https://getcomposer.org/installer | php

Vẫn trong terminal, nhập tiếp câu lệnh này để cho phép gọi lệnh Composer từ bất kỳ đâu:

mv composer.phar /usr/local/bin/composer

Một số lệnh tổng quan

Dưới đây là một số câu lệnh thường dùng khi làm việc với Composer:

  • 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

Thiết lập cho các dự án mới

Đầ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.

Tích hợp thư viện vào dự án bằng Composer

Đầu tiên, bạn cần phải xác định xem dự án PHP của mình cần dùng tới những thư viện nào bằng cách tra cứu tại đây. Sau khi đã xác định được các thư viện mà dự án PHP cần dùng, bạn cần tích hợp chúng vào dự án bằng Composer theo hai cách như sau:

Cách 1: Nhập lệnh trên 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.

Sau này, khi muốn chia sẻ dự án, bạn chỉ cần copy một mình file composer.json thay vì cả thư mục vendor. Khi paste file này sang máy khác, Composer sẽ tự động cập nhật lại thư mục vendor.

Cách 2: Nhập lệnh vào trong file 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.

Xóa thư viện khỏi dự án

Để 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:

Cách 1: Dùng lệnh composer

Từ terminal, nhập vào câu lệnh sau:

composer remove vendor/package

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

Cách 2: Cập nhật file composer.json

Đố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:

Version Range

Phương pháp này sẽ sử dụng các toán tử so sánh như >, <, >=, <=, !=, AND, OR để lấy các phiên bản cao / thấp hơn. Toán tử AND được biểu diễn bằng dấu phẩy hoặc dấu cách, toán tử OR được biểu diễn bằng hai dấu gạch dọc ( || ).

Ví dụ: Để chỉ định Composer chỉ được sử dụng các phiên bản nhỏ hơn phiên bản 0.19 đồng thời không được dùng phiên bản 0.17 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

Wildcard Versions

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 x.x.*

Ví dụ: Nếu mình dùng câu lệnh composer require phpro/grumphp "0.18.*”  thì Composer sẽ chỉ sử dụng các phiên bản từ 0.18 trở lên và từ 0.19 trở xuống (0.18.1, 0.18.2, …) của thư viện phpro/grumphp. Cách này cũng giống như việc bạn dùng “>=0.18 <0.19” như trong phương pháp Version Range.

Hyphen Ranges

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.

Ví dụ: Để chỉ định Composer chỉ được sử dụng các phiên bản lớn hơn 0.1 và nhỏ hơn 0.19 của thư viện phpro/grumphp, mình sẽ nhập vào câu lệnh composer require phpro/grumphp "0.1 - 0.18” (tức là bao gồm cả 0.18.1, 0.18.2, …). Nó tương đương với “>=0.10 <0.19”.

Tiddle Range

Phương pháp này dùng toán tử ~. Ví dụ, nếu nhập "~0.18" thì Composer sẽ chỉ dùng các phiên bản từ 0.18 trở đi (không bao gồm 0.18) và nhỏ hơn 1.0, nó tương đương với “>0.18 <1.0”.

Caret Range

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)

Dev-Master

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”.

Các bạn có thể tham khảo thêm cách dùng Composer để cài đặt các extension của Meta Box tại bài viết này.

Composer và Auto load là hai công cụ đắc lực khi làm việc với các project PHP

Autoload

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 PSR-4 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:

Code trong các thư mục cần được bố trí hợp lý để mọi class đều có thể được tham chiếu đến. Để làm điều đó, các developer cần xây dựng class theo cấu trúc dưới đây:  

\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>

Khi xây dựng class theo cấu trúc trên, class có thể được tham chiếu bởi dòng code với ba thành phần là NameSpace, SubNameSpacesClassName.

Trong đó:

  • NameSpace: Tên của vendor, là tiền tố buộc phải có và do bạn tự đặt, không được trùng tên các vendor khác.
  • SubNameSpaces: Các namespace con (theo sau namespace đầ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áp \myvendor\namespace1\namespace2\cls1 điều này có nghĩa là trong thư mục src có thư mục tên là namespace1, trong namespace1 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ùng ClassName ở thư mục tương ứng với namespace 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. 

Composer sẽ tạo ra mã 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 dùng lại thư viện của các dự án PHP khác.

Ví dụ, mình muốn tạo một class tên là Car, với namespaceVehicle/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 Vehicle\Listings

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 Carsrc/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 Vehicle\Listings\Car();

Đoạn code thứ hai:

<?php
    use Vehicle\Listings;

    $cls = new Car();

Hai đoạn code này có tác dụng như nhau, chỉ khác ở cách gọi, nên bạn dùng cái nào cũng được nhé!

Tận dụng Composer và Autoload trong PHP sẽ đem lại cho bạn nhiều lợi ích

Lời cuối

Composer và Autoload là hai công cụ vô cùng đắc lực và không thể thiếu trong PHP, bạn nên sử dụng chúng để tiết kiệm thời gian và công sức trong việc quản lý các thư viện trong dự án của mình. Hy vọng rằng bài viết này đã giúp bạn hiểu hơn về hai công cụ nói trên cũng như phần nào học được cách sử dụng chúng ở mức cơ bản. Bạn có thấy bài viết này dễ hiểu và hữu ích không? Hãy để lại nhận xét ở phần bình luận nhé!

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.

Để lại bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *