กระบวนการสร้างและเผยแพร่ปลั๊กอินพื้นฐาน
หลักการ
- ยกตัวอย่างปลั๊กอิน cross-origin ปลั๊กอินประกอบด้วยสามส่วน: ไฟล์ middleware cross-origin ไฟล์คอนฟิก
middleware.phpและInstall.phpที่สร้างโดยคำสั่ง - ใช้คำสั่งในการแพ็คไฟล์ทั้งสามและเผยแพร่ผ่าน Composer
- เมื่อผู้ใช้ติดตั้งปลั๊กอิน cross-origin ผ่าน Composer
Install.phpจะคัดลอกไฟล์ middleware และไฟล์คอนฟิกไปยัง{โปรเจกต์หลัก}/config/pluginเพื่อให้ webman โหลด ทำให้ cross-origin ทำงานโดยอัตโนมัติ - เมื่อผู้ใช้ลบปลั๊กอินผ่าน Composer
Install.phpจะลบไฟล์ middleware และไฟล์คอนฟิกที่เกี่ยวข้อง ทำให้ปลั๊กอินถูกลบโดยอัตโนมัติ
ข้อกำหนด
- ชื่อปลั๊กอินมีสองส่วน:
vendorและชื่อปลั๊กอินเช่นwebman/pushสอดคล้องกับชื่อแพ็คเกจ Composer - ไฟล์คอนฟิกปลั๊กอินเก็บใน
config/plugin/vendor/ชื่อปลั๊กอิน/(คำสั่ง console จะสร้างโฟลเดอร์คอนฟิกโดยอัตโนมัติ) ถ้าปลั๊กอินไม่ต้องใช้คอนฟิก ต้องลบโฟลเดอร์ที่สร้างอัตโนมัติ - โฟลเดอร์คอนฟิกปลั๊กอินรองรับเฉพาะ:
app.php(คอนฟิกหลัก)bootstrap.php(บูตโปรเซส)route.php(เส้นทาง)middleware.php(middleware)process.php(โปรเซสกำหนดเอง)database.php(ฐานข้อมูล)redis.php(Redis)thinkorm.php(thinkorm) webman จะรับรู้โดยอัตโนมัติ - การเข้าถึงคอนฟิก:
config('plugin.vendor.ชื่อปลั๊กอิน.ไฟล์คอนฟิก.รายการ');เช่นconfig('plugin.webman.push.app.app_key') - ถ้าปลั๊กอินมีคอนฟิกฐานข้อมูลเอง:
illuminate/databaseใช้Db::connection('plugin.vendor.ชื่อปลั๊กอิน.การเชื่อมต่อ')thinkormใช้Db::connect('plugin.vendor.ชื่อปลั๊กอิน.การเชื่อมต่อ') - ถ้าปลั๊กอินจะใส่ไฟล์ธุรกิจใน
app/ต้องไม่ชนกับโปรเจกต์หลักหรือปลั๊กอินอื่น - ปลั๊กอินควรหลีกเลี่ยงการคัดลอกไฟล์หรือโฟลเดอร์ไปยังโปรเจกต์หลัก เช่นปลั๊กอิน cross-origin คัดลอกเฉพาะคอนฟิก ไฟล์ middleware ให้อยู่ที่
vendor/webman/cros/src - แนะนำให้ใช้ PascalCase สำหรับ namespace ของปลั๊กอิน เช่น
Webman/Console
ตัวอย่าง
ติดตั้ง webman/console command line
composer require webman/console
สร้างปลั๊กอิน
สมมติว่าชื่อปลั๊กอินที่จะสร้างคือ foo/admin (เป็นชื่อโปรเจกต์ที่จะเผยแพร่ผ่าน Composer ด้วย ต้องเป็นตัวพิมพ์เล็ก) รัน:
php webman plugin:create --name=foo/admin
จะได้ vendor/foo/admin (ไฟล์ปลั๊กอิน) และ config/plugin/foo/admin (คอนฟิก)
หมายเหตุ
config/plugin/foo/adminรองรับ:app.phpbootstrap.phproute.phpmiddleware.phpprocess.phpdatabase.phpredis.phpthinkorm.phpรูปแบบเดียวกับ webman รวมเข้าระบบอัตโนมัติ
ใช้pluginเป็น prefix ในการเข้าถึง เช่นconfig('plugin.foo.admin.app')
ส่งออกปลั๊กอิน
เมื่อพัฒนาเสร็จ รัน:
php webman plugin:export --name=foo/admin
ส่งออก
คำอธิบาย
การส่งออกจะคัดลอกconfig/plugin/foo/adminไปยังvendor/foo/admin/srcและสร้างInstall.phpสำหรับรันเมื่อติดตั้ง/ถอดปลั๊กอิน
การติดตั้งเริ่มต้น: คัดลอกคอนฟิกจากvendor/foo/admin/srcไปยังconfig/pluginของโปรเจกต์
การถอดเริ่มต้น: ลบไฟล์คอนฟิกปลั๊กอินจากconfig/pluginของโปรเจกต์
แก้ไขInstall.phpได้เพื่อเพิ่มโลจิกกำหนดเองเมื่อติดตั้ง/ถอดปลั๊กอิน
ส่งปลั๊กอิน
- สมมติว่ามีบัญชี GitHub และ Packagist แล้ว
- สร้าง repo
adminบน GitHub และ push โค้ด เช่นhttps://github.com/ชื่อผู้ใช้/admin - ไปที่
https://github.com/ชื่อผู้ใช้/admin/releases/newสร้าง release เช่นv1.0.0 - ที่ Packagist คลิก
Submitส่งhttps://github.com/ชื่อผู้ใช้/adminเพื่อเผยแพร่ปลั๊กอิน
เคล็ดลับ
ถ้า Packagist แจ้งชื่อชน ให้เปลี่ยน vendor เช่น เปลี่ยนfoo/adminเป็นmyfoo/admin
เมื่ออัปเดต: push โค้ดขึ้น GitHub สร้าง release ใหม่ที่ https://github.com/ชื่อผู้ใช้/admin/releases/new จากนั้นคลิก Update ที่ https://packagist.org/packages/foo/admin
เพิ่มคำสั่งในปลั๊กอิน
ปลั๊กอินบางตัวต้องมีคำสั่งกำหนดเอง เช่น ติดตั้ง webman/redis-queue แล้วโปรเจกต์จะได้คำสั่ง redis-queue:consumer รัน php webman redis-queue:consumer send-mail จะสร้างคลาส consumer SendMail.php ได้รวดเร็ว ช่วยในการพัฒนา
เพื่อเพิ่มคำสั่ง foo-admin:add ในปลั๊กอิน foo/admin:
สร้างคำสั่ง
สร้างไฟล์ vendor/foo/admin/src/FooAdminAddCommand.php
<?php
namespace Foo\Admin;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
class FooAdminAddCommand extends Command
{
protected static $defaultName = 'foo-admin:add';
protected static $defaultDescription = 'คำอธิบายคำสั่ง';
/**
* @return void
*/
protected function configure()
{
$this->addArgument('name', InputArgument::REQUIRED, 'Add name');
}
/**
* @param InputInterface $input
* @param OutputInterface $output
* @return int
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$name = $input->getArgument('name');
$output->writeln("Admin add $name");
return self::SUCCESS;
}
}
หมายเหตุ
เพื่อหลีกเลี่ยงคำสั่งชนกันระหว่างปลั๊กอิน แนะนำรูปแบบvendor-plugin:คำสั่งเช่น คำสั่งทั้งหมดของปลั๊กอินfoo/adminควรขึ้นต้นด้วยfoo-admin:เช่นfoo-admin:add
เพิ่มคอนฟิก
สร้าง config/plugin/foo/admin/command.php
<?php
use Foo\Admin\FooAdminAddCommand;
return [
FooAdminAddCommand::class,
// เพิ่มตามต้องการ...
];
เคล็ดลับ
command.phpใช้ลงทะเบียนคำสั่งกำหนดเองของปลั๊กอิน แต่ละรายการคือคลาสคำสั่งwebman/consoleจะโหลดโดยอัตโนมัติ ดูเพิ่มเติมที่ คำสั่ง console
รันการส่งออก
รัน php webman plugin:export --name=foo/admin เพื่อส่งออกปลั๊กอินและเผยแพร่บน Packagist เมื่อติดตั้ง foo/admin แล้วจะได้คำสั่ง foo-admin:add รัน php webman foo-admin:add jerry จะพิมพ์ Admin add jerry