การใช้ Composer Plugin: เพิ่มพลังให้ Composer ของคุณ
ในบทก่อนหน้านี้ เราได้เรียนรู้วิธีการสร้าง Package Composer ของตัวเอง เพื่อแบ่งปันโค้ดและนำกลับมาใช้ใหม่ได้อย่างมีประสิทธิภาพ ในบทนี้ เราจะก้าวไปอีกขั้นด้วยการเรียนรู้วิธีการใช้ Composer Plugin เพื่อขยายขีดความสามารถของ Composer ให้ตอบโจทย์ความต้องการเฉพาะของคุณได้มากยิ่งขึ้น
Plugin Installation: ติดตั้ง Plugin ง่ายๆ ด้วย Composer
Composer Plugin ก็เหมือนกับ Package Composer ทั่วไป นั่นคือเราสามารถติดตั้งมันได้ง่ายๆ ด้วยคำสั่ง composer require ตัวอย่างเช่น หากเราต้องการติดตั้ง Plugin ที่ช่วยในการตรวจสอบ Code Style เราสามารถใช้คำสั่ง:
composer require friendsofphp/php-cs-fixer
หลังจากติดตั้งแล้ว Composer จะทำการ Register Plugin โดยอัตโนมัติ หาก Plugin นั้นถูกออกแบบมาอย่างถูกต้อง (ซึ่งเราจะพูดถึงในภายหลัง) Composer จะรับรู้ถึง Plugin และสามารถใช้งาน Functionality ที่ Plugin นั้นมอบให้ได้ทันที
Trade-off: การใช้ Plugin ช่วยให้เราไม่ต้องเขียนโค้ดเองทั้งหมด แต่ก็ต้องพึ่งพา Third-party Library ซึ่งอาจมีปัญหาเรื่อง Security หรือ Maintenance ในระยะยาว ดังนั้นจึงควรเลือก Plugin ที่น่าเชื่อถือและมีการดูแลอย่างสม่ำเสมอ
Custom Commands: สร้างคำสั่ง Composer ของคุณเอง
Plugin สามารถเพิ่ม Custom Commands ให้กับ Composer ได้ ทำให้เราสามารถรัน Task ต่างๆ ได้อย่างสะดวกสบายจาก Command Line ตัวอย่างเช่น Plugin ที่เราติดตั้งไปก่อนหน้านี้ (friendsofphp/php-cs-fixer) จะเพิ่มคำสั่ง php-cs-fixer ให้เราสามารถรัน Code Style Fixer ได้โดยตรงจาก Composer
composer php-cs-fixer fix
เหตุผลเชิงออกแบบ: การสร้าง Custom Commands ช่วยให้เราสามารถ Automate Task ที่ซ้ำซากจำเจได้ เช่น การ Compile Assets, การ Generate Documentation หรือการ Deploy Application
ตัวอย่าง: สมมติว่าเราต้องการสร้าง Plugin ที่ช่วยในการ Generate Migration Files สำหรับ Database เราสามารถสร้าง Custom Command ชื่อ generate-migration ที่รับ Parameter เป็นชื่อ Migration และสร้างไฟล์ Migration ให้เราโดยอัตโนมัติ
แนวปฏิบัติที่ดี: ควรตั้งชื่อ Command ให้สื่อความหมายและสอดคล้องกับ Functionality ที่ Command นั้นมอบให้ และควรมี Documentation ที่ชัดเจนเกี่ยวกับการใช้งาน Command
Event Listeners: ตอบสนองต่อเหตุการณ์ต่างๆ ใน Composer
Composer มี Event System ที่อนุญาตให้ Plugin ทำงานเมื่อมีเหตุการณ์ต่างๆ เกิดขึ้น เช่น ก่อนหรือหลังการ Install Dependencies, ก่อนหรือหลังการ Update Dependencies หรือเมื่อมี Error เกิดขึ้น
เหตุผลเชิงออกแบบ: Event Listeners ช่วยให้ Plugin สามารถทำงานใน Background โดยไม่ต้องรบกวนการทำงานหลักของ Composer ตัวอย่างเช่น Plugin ที่ใช้สำหรับ Logging สามารถ Listen ไปยัง Event pre-command-run เพื่อบันทึกว่า Command อะไรกำลังจะถูกรัน หรือ Listen ไปยัง Event post-command-run เพื่อบันทึกผลลัพธ์ของ Command นั้น
ตัวอย่าง: สมมติว่าเราต้องการสร้าง Plugin ที่ส่ง Notification ไปยัง Slack เมื่อมีการ Update Dependencies เราสามารถ Listen ไปยัง Event post-dependencies-update และส่ง Notification ไปยัง Slack API
วิธีการทำงาน: Plugin จะต้อง Register Event Listeners ในไฟล์ composer.json โดยระบุชื่อ Event และ Class ที่จะ Handle Event นั้น ตัวอย่างเช่น:
{
"name": "my-vendor/my-plugin",
"type": "composer-plugin",
"require": {
"composer-plugin-api": "^2.0"
},
"autoload": {
"psr-4": {
"MyVendor\\MyPlugin\\": "src/"
}
},
"extra": {
"class": "MyVendor\\MyPlugin\\Plugin"
},
"config": {
"allow-plugins": {
"my-vendor/my-plugin": true
}
},
"scripts": {
"post-dependencies-update": [
"MyVendor\\MyPlugin\\EventHandler::onPostDependenciesUpdate"
]
}
}
ในตัวอย่างนี้ เราได้กำหนด Script post-dependencies-update ที่จะถูกรันหลังจาก Dependencies ถูก Update Script นี้จะเรียก Method onPostDependenciesUpdate ใน Class MyVendor\MyPlugin\EventHandler
Trade-off: การใช้ Event Listeners อาจทำให้ Code Base ซับซ้อนขึ้น และอาจ Debug ยากกว่าการเขียนโค้ดแบบ Synchronous ดังนั้นจึงควรใช้ Event Listeners อย่างระมัดระวังและมี Documentation ที่ชัดเจน
แนวปฏิบัติที่ดี: ควรแยก Logic ของ Event Listener ออกจาก Logic หลักของ Plugin เพื่อให้ Code สามารถ Maintain ได้ง่าย และควรมี Unit Test สำหรับ Event Listeners เพื่อให้มั่นใจว่ามันทำงานได้อย่างถูกต้อง
สรุป
Composer Plugin เป็นเครื่องมือที่มีประสิทธิภาพที่ช่วยให้เราสามารถขยายขีดความสามารถของ Composer ได้อย่างง่ายดาย ไม่ว่าจะเป็นการเพิ่ม Custom Commands หรือการตอบสนองต่อเหตุการณ์ต่างๆ ใน Composer การใช้ Plugin ช่วยให้เราสามารถ Automate Task ที่ซ้ำซากจำเจ และปรับแต่ง Composer ให้ตอบโจทย์ความต้องการเฉพาะของเราได้มากยิ่งขึ้น
ในบทถัดไป เราจะเรียนรู้เกี่ยวกับการ Config Composer สำหรับ Project ขนาดใหญ่ เพื่อให้มั่นใจว่า Composer ทำงานได้อย่างมีประสิทธิภาพและสามารถจัดการ Dependencies จำนวนมากได้อย่างราบรื่น