การใช้ Composer จัดการ Dependencies
ในบทเรียนก่อนหน้า เราได้เรียนรู้เกี่ยวกับการสร้าง API และ Web Services ใน PHP ไปพอสมควร การพัฒนาโปรเจกต์ API ขนาดใหญ่ขึ้นเรื่อยๆ จะทำให้เราต้องพึ่งพา Library หรือ Package ภายนอก เพื่อช่วยให้การทำงานง่ายและเร็วขึ้น การจัดการ Library เหล่านี้ด้วยตัวเองอาจเป็นเรื่องยุ่งยาก Composer จึงเข้ามาช่วยแก้ปัญหานี้
Composer คืออะไร
Composer คือ Dependency Manager สำหรับ PHP เปรียบเสมือนเครื่องมือที่ช่วยจัดการ Library หรือ Package ที่โปรเจกต์ของเราต้องการใช้งาน โดย Composer จะทำหน้าที่:
- จัดการ Dependencies: ติดตั้ง, อัพเดท, และถอนการติดตั้ง Library ที่โปรเจกต์ต้องการ
- จัดการ Version: ระบุ Version ของ Library ที่ต้องการใช้งาน และตรวจสอบความเข้ากันได้
- Autoloading: ช่วยโหลด Class จาก Library ต่างๆ โดยอัตโนมัติ ทำให้เราไม่ต้อง `require` หรือ `include` ไฟล์เอง
เหตุผลเชิงออกแบบ: Composer ถูกออกแบบมาเพื่อแก้ปัญหาการจัดการ Dependencies ที่ซับซ้อนใน PHP โปรเจกต์ การจัดการ Dependencies ด้วยตัวเอง (เช่น การดาวน์โหลดไฟล์ .zip และนำมาวางในโฟลเดอร์) ทำให้เกิดปัญหาเรื่อง Version Conflict, การจัดการ Dependencies ที่ซับซ้อน (A ขึ้นอยู่กับ B และ C), และการ Autoloading ที่ไม่สะดวก Composer ช่วยแก้ปัญหาเหล่านี้ได้ทั้งหมด ทำให้การพัฒนาโปรเจกต์ PHP เป็นระเบียบและง่ายขึ้น
การติดตั้ง Composer
การติดตั้ง Composer ทำได้หลายวิธี ขึ้นอยู่กับระบบปฏิบัติการที่ใช้งาน
บน Windows
- ดาวน์โหลด Composer-Setup.exe จาก https://getcomposer.org/download/
- รันไฟล์ Composer-Setup.exe และทำตามขั้นตอนใน Wizard
- ตรวจสอบว่า Composer ถูกติดตั้งสำเร็จ โดยเปิด Command Prompt และพิมพ์ `composer -v`
บน macOS และ Linux
คุณสามารถติดตั้ง Composer ผ่าน Terminal ได้โดยใช้คำสั่ง:
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
composer -v
คำอธิบาย:
- `curl -sS https://getcomposer.org/installer | php`: ดาวน์โหลดและรัน Installer ของ Composer
- `mv composer.phar /usr/local/bin/composer`: ย้ายไฟล์ `composer.phar` ไปยัง `/usr/local/bin/` และเปลี่ยนชื่อเป็น `composer` เพื่อให้สามารถเรียกใช้งาน Composer ได้จากทุกที่
- `composer -v`: ตรวจสอบว่า Composer ถูกติดตั้งสำเร็จ
หลังจากติดตั้ง Composer สำเร็จแล้ว ให้ตรวจสอบ Version โดยพิมพ์ `composer -v` ใน Terminal หรือ Command Prompt หากเห็น Version ของ Composer แสดงขึ้นมา แสดงว่าการติดตั้งสำเร็จ
การใช้งาน Composer
เมื่อติดตั้ง Composer เสร็จแล้ว เรามาดูวิธีการใช้งาน Composer ในโปรเจกต์ PHP ของเรา
1. สร้างไฟล์ composer.json
ไฟล์ `composer.json` คือไฟล์ที่เก็บข้อมูลเกี่ยวกับ Dependencies ของโปรเจกต์ รวมถึง Version และข้อมูลอื่นๆ สร้างไฟล์ `composer.json` ใน Root Directory ของโปรเจกต์
ตัวอย่าง `composer.json`:
{
"name": "your-vendor/your-project",
"description": "A brief description of your project",
"require": {
"monolog/monolog": "2.0.*"
},
"autoload": {
"psr-4": {
"YourNamespace\\": "src/"
}
}
}
คำอธิบาย:
- `name`: ชื่อของ Package (Vendor/Package Name)
- `description`: คำอธิบายสั้นๆ เกี่ยวกับโปรเจกต์
- `require`: ส่วนที่ระบุ Dependencies ที่โปรเจกต์ต้องการใช้งาน ในตัวอย่างนี้ เราต้องการใช้ `monolog/monolog` Version 2.0.*
- `autoload`: ส่วนที่กำหนดวิธีการ Autoload Class โดยใช้ PSR-4 Standard ในตัวอย่างนี้ Class ที่อยู่ใน Namespace `YourNamespace\` จะถูกโหลดจาก Directory `src/`
แนวปฏิบัติที่ดี:
- ควรกำหนด `name` ให้มีความหมายและสื่อถึงโปรเจกต์
- ควรอธิบาย `description` ให้ชัดเจน เพื่อให้ผู้อื่นเข้าใจว่าโปรเจกต์นี้ทำอะไร
- ควรกำหนด Version ของ Dependencies ให้ชัดเจน เพื่อหลีกเลี่ยงปัญหา Version Conflict
- ควรใช้ PSR-4 Standard สำหรับ Autoloading เพื่อให้ Code เป็นระเบียบและง่ายต่อการบำรุงรักษา
2. ติดตั้ง Dependencies
หลังจากสร้างไฟล์ `composer.json` แล้ว ให้เปิด Terminal หรือ Command Prompt ไปยัง Root Directory ของโปรเจกต์ และรันคำสั่ง:
composer install
Composer จะอ่านไฟล์ `composer.json` และดาวน์โหลด Dependencies ที่ระบุไว้ลงใน Directory `vendor/` นอกจากนี้ Composer จะสร้างไฟล์ `composer.lock` ซึ่งเก็บข้อมูล Version ของ Dependencies ที่ติดตั้งไว้ เพื่อให้มั่นใจว่าทุกคนในทีมจะใช้ Dependencies Version เดียวกัน
3. Autoloading
Composer จะสร้างไฟล์ `vendor/autoload.php` ซึ่งเป็นไฟล์ที่ใช้สำหรับ Autoloading Class จาก Dependencies ต่างๆ ในโปรเจกต์ของเรา เพียงแค่ `require` ไฟล์นี้ใน Script PHP ของเรา ก็จะสามารถใช้งาน Class จาก Dependencies ได้ทันที
require __DIR__ . '/vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
// Create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your/log.txt', Logger::WARNING));
// Add records to the log
$log->warning('Foo');
$log->error('Bar');
4. อัพเดท Dependencies
เมื่อมี Version ใหม่ของ Dependencies ออกมา เราสามารถอัพเดท Dependencies ได้โดยรันคำสั่ง:
composer update
Composer จะตรวจสอบ Version ใหม่ของ Dependencies และอัพเดท Dependencies ในโปรเจกต์ของเรา หลังจากอัพเดทแล้ว Composer จะอัพเดทไฟล์ `composer.lock` ด้วย
5. เพิ่ม Dependencies ใหม่
หากต้องการเพิ่ม Dependencies ใหม่ในโปรเจกต์ สามารถทำได้โดยแก้ไขไฟล์ `composer.json` และเพิ่ม Dependencies ใหม่ในส่วน `require` หรือใช้คำสั่ง `composer require`
composer require guzzlehttp/guzzle
คำสั่งนี้จะเพิ่ม `guzzlehttp/guzzle` ลงในไฟล์ `composer.json` และติดตั้ง Dependencies พร้อมทั้งอัพเดทไฟล์ `composer.lock`
ตัวอย่างการใช้งาน Composer กับ API
สมมติว่าเราต้องการใช้ Guzzle HTTP Client ใน API ของเรา เพื่อเรียก API ภายนอก
- เพิ่ม Guzzle ลงใน `composer.json` (หรือใช้ `composer require guzzlehttp/guzzle`)
- รัน `composer install`
- ใช้งาน Guzzle ใน API ของเรา
<?php
require __DIR__ . '/vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client();
$response = $client->request('GET', 'https://api.example.com/users');
echo $response->getBody();
?>
ข้อควรระวัง: เมื่อ Deploy โปรเจกต์ขึ้น Server จริง อย่าลืม Upload ไฟล์ `composer.json` และ `composer.lock` ไปด้วย และรัน `composer install` บน Server เพื่อติดตั้ง Dependencies
สรุป
Composer เป็นเครื่องมือที่สำคัญสำหรับการจัดการ Dependencies ในโปรเจกต์ PHP การใช้งาน Composer ช่วยให้เราจัดการ Library ต่างๆ ได้อย่างเป็นระบบ และลดความยุ่งยากในการพัฒนาโปรเจกต์ API ขนาดใหญ่ ในบทเรียนถัดไป เราจะเรียนรู้เกี่ยวกับการใช้ PHP Framework (Laravel/Symfony) เบื้องต้น ซึ่ง Framework เหล่านี้ก็ใช้ Composer ในการจัดการ Dependencies เช่นกัน