แอพพลิเคชั่นปลั๊กอิน

แต่ละแอพพลิเคชั่นปลั๊กอินเป็นแอพพลิเคชั่นที่สมบูรณ์ โดยมีซอร์สโค้ดจัดเก็บอยู่ในไดเรกทอรี {主项目}/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 เท่านั้น