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ủ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 myvendornamespace1namespace2cls1 đ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.

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

Next Post Previous Post