Trang chủ » Composer là gì (Phần 2)?
Lập trình PHP

Composer là gì (Phần 2)?

Xin chào mọi người! Ở bài Composer là gì (Phần 1)?, mình đã giới thiệu sơ bộ về Composer và cách cài đặt. Nó là 1 bộ công cụ rất tuyệt vời cho các lập trình viên PHP, cho phép ta có thể quản lý các dependencies một cách hiệu quả nhất. Và ở bài viết này, mình sẽ đi sâu một chút vào Composer để thấy được điều kì diệu mà nó mang lại nhé!

Composer là gì?

Sử dụng libraries bằng Composer:

Khi install các dependencies thành công, Composer tự generate 1 file vendor/autoload.php. Để sử dụng các dependencies ta chỉ đơn giản là include file đó vào trong project chính của mình. Thật dễ dàng phải không? Và việc còn lại của bạn là sử dụng thôi :D.

$log = new Monolog\Logger('name');
// This is your code...
// Blah blah blah

Vậy là ta đã có thể sử dụng các libraries có sẵn thành công. Thế nhưng nếu bạn muốn tạo ra 1 library và sử dụng nó bằng Composer thì sao?

Thêm package tự tạo bằng Composer:

Như mình đã nói ở phần 1, Composer làm việc với các file composer.json với mỗi package. Vậy còn file composer.json ở ngay thư mục chính của project thì sao? Tất nhiên project chính của mình cũng được tính là 1 package. Khi file composer.json chính có lệnh require có nghĩa là bạn muốn package chính của mình phải include các packages trong khai báo require. Sự khác biệt duy nhất của project chính của mình và các packages là project chính là một package không có tên.

Để có thể install package tự tạo bằng Composer, trước hết ta phải đặt tên cho package:

{
    "name": "vhson0610/composer_demo",
    "require": {
        "monolog/monolog": "1.19.*"
    }
}

Với file mẫu trên, project name sẽ là vhson0610/demo-composer, và vhson0610 là vendor name (nếu không biết đặt vendor name như thế nào thì ta có thể sử dụng GitHub username như là vendor name, giống như GitHub url của mình).

Upload lên VCS

Chỉ việc upload package mình viết kèm file composer.json lên VCS (chẳng hạn như Git, SVN,…), ta đã có thể install nó thông qua Composer rồi đấy!

Giả sử ở đây mình có 1 package tên là vhson0610/composer_demo (url ở đây). Package này chỉ có nhiệm vụ duy nhất là echo 1 dòng hello world. Và trong file composer.json ở project chính của mình:

{
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/vhson0610/composer_demo"
        }
    ],
    "require": {
        "vhson0610/composer_demo": "dev-master"
    }
}

Chỉ vậy thôi, là bạn đã có thể dùng composer install và tải về thành công rồi đấy!

Upload lên Packagist

OK, vậy là bạn đã có thể upload và install thành công 1 package tự tạo rồi, nhưng có gì đó không ổn? Còn nhớ trong phần 1, khi mình sử dụng monolog/monolog, mình đâu có cần khai báo keyword repositories đâu nhỉ? Vậy thằng Monolog nó làm như thế nào? Câu trả lời là Packagist.

Packagist là package repository chính của Composer, nó giống như 1 cầu nối trung gian giữa bạn và VCS repository vậy. Do monolog/monolog có ở trên Packagist, ta có thể install nó mà không cần khai báo keyword repositories.

…và sử dụng package:

Install được đã đành, nhưng ta không thể sử dụng class Demo() có sẵn trong package giống như khi sử dụng monolog/monolog được. Ta cần phải thêm vào file composer.json ở trong package 1 trường:

{
    "autoload": {
        "psr-4": {
            "TCS\\": "src/"
        }
    }
}

Có 2 chuẩn được Composer hỗ trợ, đó là PSR-0PSR-4. PSR (PHP Standards Recommandation) là một tiêu chuẩn được khuyến cáo sử dụng khi lập trình PHP, và vẫn đang hoàn chỉnh, được sử dụng để đảm bảo tính thống nhất về cách viết code, tổ chức ứng dụng,… nhằm dễ quản lý, đọc, và tái sử dụng. Hiện tại đã có các chuẩn từ PSR-0 đến PSR-7 (tuy nhiên PSR-0 đã lỗi thời và thay bằng PSR-4). Ở Composer sử dụng 2 chuẩn PSR-0 và PSR-4, trình bày về cách sử dụng include, require với các files PHP, classes, functions, và chính Composer cũng khuyến cáo sử dụng PSR-4 để autoload bởi vì nó dễ sử dụng hơn.

Dựa theo file mẫu trên, khi ta khai báo:

$text = new TCS\Demo();

thì namespace TCS\\ được ngầm hiểu là trỏ đến thư mục src\. Ta cần phải ghi \\ để tránh xung đột trong việc khai báo chuỗi (vì \ quy định ký tự đặc biệt kế tiếp). Giả sử ta muốn sử dụng 1 namespace cho nhiều thư mục thì:

{
    "autoload": {
        "psr-4": {
            "TCS\\": ["src/", "lib/"]
        }
    }
}

…và nếu muốn mọi namespace đều có thể sử dụng thư mục thì:

{
    "autoload": {
        "psr-4": {
            "": "src/"
        }
    }
}

Vậy là ta đã có thể sử dụng class Demo() một cách trơn tru rồi! Thật đơn giản phải không nào?

Trên đây là phần 2 của loạt bài viết giới thiệu Composer. Cảm ơn mọi người đã chú ý theo dõi. Hẹn gặp lại ở những bài viết tiếp theo!

About the author

Võ Hoài Sơn

Tính tình bất định
Chọc vào là bịnh
Rất yêu lập trình
Luôn code hết mình
Mình hiện đang là sinh viên của trường ĐH Khoa học tự nhiên TPHCM. Bản thân rất thích code, kiêm luôn cả mần thơ nên thường hơi hâm hâm dở dở. Ngoài ra chém gió, chém chuối, chém trái cây các kiểu cũng là sở trường của mình. Rất mong được làm quen với các bạn :D

Add Comment