แอพพลิเคชั่นปลั๊กอิน
แต่ละแอพพลิเคชั่นปลั๊กอินเป็นแอพพลิเคชั่นที่สมบูรณ์ โดยมีซอร์สโค้ดจัดเก็บอยู่ในไดเรกทอรี {主项目}/plugin
คำแนะนำ
ใช้คำสั่งphp webman app-plugin:create {插件名}
เพื่อสร้างแอพพลิเคชั่นปลั๊กอินในเครื่อง
เช่นphp webman app-plugin:create cms
จะสร้างโครงสร้างไดเรกทอรีดังนี้
plugin/
└── cms
├── app
│ ├── controller
│ │ └── IndexController.php
│ ├── exception
│ │ └── Handler.php
│ ├── functions.php
│ ├── middleware
│ ├── model
│ └── view
│ └── index
│ └── index.html
├── config
│ ├── app.php
│ ├── autoload.php
│ ├── container.php
│ ├── database.php
│ ├── exception.php
│ ├── log.php
│ ├── middleware.php
│ ├── process.php
│ ├── redis.php
│ ├── route.php
│ ├── static.php
│ ├── thinkorm.php
│ ├── translation.php
│ └── view.php
└── public
เราจะเห็นว่าแอพพลิเคชั่นปลั๊กอินมีโครงสร้างไดเรกทอรีและไฟล์คอนฟิกที่เหมือนกับ webman จริงๆ แล้วการพัฒนาแอพพลิเคชั่นปลั๊กอินกับการพัฒนาโปรเจกต์ webman มีประสบการณ์ที่คล้ายคลึงกัน โดยต้องใส่ใจในบางเรื่องดังนี้
เนมสเปซ
ไดเรกทอรีและการตั้งชื่อปลั๊กอินปฏิบัติตามมาตรฐาน PSR4 เนื่องจากปลั๊กอินทั้งหมดจะถูกเก็บในไดเรกทอรี plugin ดังนั้นเนมสเปซจะเริ่มต้นด้วย plugin เช่น plugin\cms\app\controller\UserController
ที่นี่ cms คือไดเรกทอรีหลักของซอร์สโค้ดปลั๊กอิน
การเข้าถึง URL
ที่อยู่ URL ของแอพพลิเคชั่นปลั๊กอินจะเริ่มต้นด้วย /app
เช่น plugin\cms\app\controller\UserController
ที่อยู่ URL คือ http://127.0.0.1:8787/app/cms/user
。
ไฟล์สถิต
ไฟล์สถิตจะถูกเก็บใน plugin/{插件}/public
เช่น การเข้าถึง http://127.0.0.1:8787/app/cms/avatar.png
จะเป็นการเข้าถึงไฟล์ plugin/cms/public/avatar.png
。
ไฟล์คอนฟิก
การตั้งค่าของปลั๊กอินจะเหมือนกับโปรเจกต์ webman ปกติ แต่การตั้งค่าปลั๊กอินทั่วไปจะมีผลเฉพาะกับปลั๊กอินนั้นๆ โดยทั่วไปไม่ส่งผลต่อโปรเจกต์หลัก
ตัวอย่างเช่น ค่าของ plugin.cms.app.controller_suffix
จะมีผลเฉพาะกับปลั๊กอินในส่วนของซอฟต์แวร์ควบคุม ไม่มีผลต่อโปรเจกต์หลัก
ตัวอย่างเช่น ค่าของ plugin.cms.app.controller_reuse
จะมีผลเฉพาะกับการใช้งานซอฟต์แวร์ควบคุมของปลั๊กอิน ไม่มีผลต่อโปรเจกต์หลัก
ตัวอย่างเช่น ค่าของ plugin.cms.middleware
จะมีผลเฉพาะกับมิดเดิลแวร์ของปลั๊กอิน ไม่มีผลต่อโปรเจกต์หลัก
ตัวอย่างเช่น ค่าของ plugin.cms.view
จะมีผลเฉพาะกับวิวที่ปลั๊กอินใช้งาน ไม่มีผลต่อโปรเจกต์หลัก
ตัวอย่างเช่น ค่าของ plugin.cms.container
จะมีผลเฉพาะกับคอนเทนเนอร์ที่ปลั๊กอินใช้งาน ไม่มีผลต่อโปรเจกต์หลัก
ตัวอย่างเช่น ค่าของ plugin.cms.exception
จะมีผลเฉพาะกับคลาสการจัดการข้อยกเว้นของปลั๊กอิน ไม่มีผลต่อโปรเจกต์หลัก
แต่เนื่องจากเส้นทางเป็นระดับโลก ดังนั้นเส้นทางที่ตั้งค่าจากปลั๊กอินจึงมีผลต่อระดับโลกเช่นกัน
การดึงข้อมูลการตั้งค่า
วิธีการดึงข้อมูลการตั้งค่าของปลั๊กอินคือ config('plugin.{插件}.{具体的配置}');
ตัวอย่างเช่น การดึงค่าทั้งหมดจาก plugin/cms/config/app.php
สามารถทำได้ด้วย config('plugin.cms.app')
เช่นเดียวกัน โปรเจกต์หลักหรือปลั๊กอินอื่นๆ สามารถใช้ config('plugin.cms.xxx')
เพื่อดึงค่าการตั้งค่าของปลั๊กอิน cms
การตั้งค่าที่ไม่รองรับ
แอพพลิเคชั่นปลั๊กอินไม่รองรับการตั้งค่า server.php, session.php ไม่รองรับ app.request_class
, app.public_path
, app.runtime_path
การตั้งค่า
ฐานข้อมูล
ปลั๊กอินสามารถตั้งค่าฐานข้อมูลของตัวเองได้ เช่น เนื้อหาของ plugin/cms/config/database.php
เป็นดังนี้
return [
'default' => 'mysql',
'connections' => [
'mysql' => [ // mysql คือชื่อการเชื่อมต่อ
'driver' => 'mysql',
'host' => '127.0.0.1',
'port' => 3306,
'database' => 'ฐานข้อมูล',
'username' => 'ชื่อผู้ใช้',
'password' => 'รหัสผ่าน',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_general_ci',
],
'admin' => [ // admin คือชื่อการเชื่อมต่อ
'driver' => 'mysql',
'host' => '127.0.0.1',
'port' => 3306,
'database' => 'ฐานข้อมูล',
'username' => 'ชื่อผู้ใช้',
'password' => 'รหัสผ่าน',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_general_ci',
],
],
];
วิธีการเรียกใช้งานคือ Db::connection('plugin.{插件}.{连接名}');
เช่น
use support\Db;
Db::connection('plugin.cms.mysql')->table('user')->first();
Db::connection('plugin.cms.admin')->table('admin')->first();
หากต้องการใช้ฐานข้อมูลของโปรเจกต์หลัก ก็สามารถใช้ได้โดยตรง เช่น
use support\Db;
Db::table('user')->first();
// สมมติว่าโปรเจกต์หลักได้ตั้งค่าการเชื่อมต่อ admin ไว้
Db::connection('admin')->table('admin')->first();
คำแนะนำ
thinkorm ก็ใช้วิธีที่คล้ายกัน
Redis
การใช้งาน Redis จะคล้ายกับการใช้งานฐานข้อมูล เช่น plugin/cms/config/redis.php
return [
'default' => [
'host' => '127.0.0.1',
'password' => null,
'port' => 6379,
'database' => 0,
],
'cache' => [
'host' => '127.0.0.1',
'password' => null,
'port' => 6379,
'database' => 1,
],
];
เมื่อใช้
use support\Redis;
Redis::connection('plugin.cms.default')->get('key');
Redis::connection('plugin.cms.cache')->get('key');
เช่นเดียวกัน หากต้องการใช้การตั้งค่า Redis ของโปรเจกต์หลัก
use support\Redis;
Redis::get('key');
// สมมติว่าโปรเจกต์หลักได้ตั้งค่าการเชื่อมต่อ cache ไว้
Redis::connection('cache')->get('key');
บันทึก
วิธีการใช้งานคลาสบันทึกยังคล้ายกับการใช้งานฐานข้อมูล
use support\Log;
Log::channel('plugin.admin.default')->info('test');
หากต้องการใช้การตั้งค่าบันทึกของโปรเจกต์หลัก สามารถใช้ได้โดยตรง
use support\Log;
Log::info('เนื้อหาบันทึก');
// สมมติว่าโปรเจกต์หลักมีการตั้งค่าบันทึกที่ชื่อ test
Log::channel('test')->info('เนื้อหาบันทึก');
การติดตั้งและถอนการติดตั้งปลั๊กอิน
การติดตั้งแอพพลิเคชั่นปลั๊กอินจำเป็นต้องคัดลอกไดเรกทอรีปลั๊กอินไปยังไดเรกทอรี {主项目}/plugin
เท่านั้น ต้องมีการ reload หรือ restart ถึงจะมีผล
ในการถอนการติดตั้งทำได้โดยการลบไดเรกทอรีปลั๊กอินที่ตรงกับ {主项目}/plugin
เท่านั้น