Ứ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ệnhphp 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\UserController
là http://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.php
là config('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
.