Ứng dụng Plugin

Mỗi ứng dụng plugin là một ứng dụng hoàn chỉnh, mã nguồn được đặt trong thư mục {主项目}/plugin

Ghi chú
Sử dụng lệnh php webman app-plugin:create {插件名} có thể tạo một ứng dụng plugin tại địa phương,
ví dụ php webman app-plugin:create cms sẽ tạo cấu trúc thư mục như sau

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

Chúng ta thấy một ứng dụng plugin có cấu trúc thư mục và tệp cấu hình tương tự như webman. Trên thực tế, việc phát triển một ứng dụng plugin và phát triển một dự án webman có trải nghiệm gần như tương tự, chỉ cần lưu ý vài điểm sau.

Không gian tên

Thư mục và tên plugin tuân theo quy định PSR4, vì các plugin đều được đặt trong thư mục plugin, nên không gian tên đều bắt đầu bằng plugin, ví dụ plugin\cms\app\controller\UserController, ở đây cms là thư mục chính chứa mã nguồn của plugin.

URL truy cập

Địa chỉ URL ứng dụng plugin đều bắt đầu bằng /app, ví dụ địa chỉ URL của plugin\cms\app\controller\UserControllerhttp://127.0.0.1:8787/app/cms/user

Tệp tĩnh

Tệp tĩnh được đặt trong plugin/{插件}/public, ví dụ truy cập http://127.0.0.1:8787/app/cms/avatar.png thực sự là để lấy tệp plugin/cms/public/avatar.png

Tệp cấu hình

Cấu hình của plugin cũng giống như dự án webman thông thường, nhưng cấu hình của plugin thường chỉ có hiệu lực đối với plugin hiện tại, không ảnh hưởng đến dự án chính.
Ví dụ giá trị của plugin.cms.app.controller_suffix chỉ ảnh hưởng đến hậu tố của bộ điều khiển trong plugin, không ảnh hưởng đến dự án chính.
Ví dụ giá trị của plugin.cms.app.controller_reuse chỉ ảnh hưởng đến việc plugin có tái sử dụng bộ điều khiển hay không, không ảnh hưởng đến dự án chính.
Ví dụ giá trị của plugin.cms.middleware chỉ ảnh hưởng đến middleware của plugin, không ảnh hưởng đến dự án chính.
Ví dụ giá trị của plugin.cms.view chỉ ảnh hưởng đến các khung nhìn được sử dụng bởi plugin, không ảnh hưởng đến dự án chính.
Ví dụ giá trị của plugin.cms.container chỉ ảnh hưởng đến container được sử dụng bởi plugin, không ảnh hưởng đến dự án chính.
Ví dụ giá trị của plugin.cms.exception chỉ ảnh hưởng đến lớp xử lý ngoại lệ của plugin, không ảnh hưởng đến dự án chính.

Tuy nhiên, vì định tuyến là toàn cầu, nên định tuyến được cấu hình trong plugin cũng ảnh hưởng đến toàn cục.

Lấy cấu hình

Phương pháp lấy cấu hình của một plugin là config('plugin.{插件}.{具体的配置}');, ví dụ lấy tất cả cấu hình của plugin/cms/config/app.phpconfig('plugin.cms.app')
Tương tự, dự án chính hoặc các plugin khác cũng có thể dùng config('plugin.cms.xxx') để lấy cấu hình của plugin cms.

Cấu hình không được hỗ trợ

Các ứng dụng plugin không hỗ trợ cấu hình server.php, session.php, không hỗ trợ cấu hình app.request_class, app.public_path, app.runtime_path.

Cơ sở dữ liệu

Plugin có thể cấu hình cơ sở dữ liệu riêng, ví dụ nội dung của plugin/cms/config/database.php như sau

return  [
    'default' => 'mysql',
    'connections' => [
        'mysql' => [ // mysql là tên kết nối
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => '数据库',
            'username'    => '用户名',
            'password'    => '密码',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
        'admin' => [ // admin là tên kết nối
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => '数据库',
            'username'    => '用户名',
            'password'    => '密码',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
    ],
];

Cách trích dẫn là Db::connection('plugin.{插件}.{连接名}');, ví dụ

use support\Db;
Db::connection('plugin.cms.mysql')->table('user')->first();
Db::connection('plugin.cms.admin')->table('admin')->first();

Nếu muốn sử dụng cơ sở dữ liệu của dự án chính, chỉ cần sử dụng như bình thường, ví dụ

use support\Db;
Db::table('user')->first();
// Giả sử dự án chính còn cấu hình một kết nối admin
Db::connection('admin')->table('admin')->first();

Ghi chú
thinkorm cũng có cách sử dụng tương tự

Redis

Cách sử dụng Redis cũng tương tự như cơ sở dữ liệu, ví dụ 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,
    ],
];

Sử dụng như sau

use support\Redis;
Redis::connection('plugin.cms.default')->get('key');
Redis::connection('plugin.cms.cache')->get('key');

Tương tự, nếu muốn tái sử dụng cấu hình Redis của dự án chính

use support\Redis;
Redis::get('key');
// Giả sử dự án chính còn cấu hình một kết nối cache
Redis::connection('cache')->get('key');

Nhật ký

Cách sử dụng lớp ghi log cũng tương tự như cách sử dụng cơ sở dữ liệu

use support\Log;
Log::channel('plugin.admin.default')->info('test');

Nếu muốn tái sử dụng cấu hình log của dự án chính, chỉ cần sử dụng

use support\Log;
Log::info('日志内容');
// Giả sử dự án chính có một cấu hình log tên là test
Log::channel('test')->info('日志内容');

Cài đặt và gỡ cài đặt ứng dụng plugin

Khi cài đặt ứng dụng plugin, chỉ cần sao chép thư mục plugin vào thư mục {主项目}/plugin là được, cần phải reload hoặc restart để có hiệu lực.
Khi gỡ cài đặt, chỉ cần xóa thư mục plugin tương ứng trong {主项目}/plugin.