Quy trình tạo và phát hành plugin cơ bản
Nguyên lý
- Lấy plugin cross-origin làm ví dụ: plugin gồm ba phần – file middleware cross-origin, file cấu hình
middleware.phpvàInstall.phpđược tạo tự động bằng lệnh. - Dùng lệnh để đóng gói ba file này và phát hành lên Composer.
- Khi người dùng cài plugin cross-origin bằng Composer,
Install.phpsao chép file middleware và cấu hình vào{dự án chính}/config/pluginđể webman tải và kích hoạt cross-origin. - Khi người dùng gỡ plugin bằng Composer,
Install.phpxóa các file middleware và cấu hình tương ứng, thực hiện gỡ cài tự động.
Quy định
- Tên plugin gồm hai phần:
vendorvàtên plugin, ví dụwebman/push, tương ứng với tên gói Composer. - File cấu hình plugin đặt trong
config/plugin/vendor/tên plugin/(lệnh console tự tạo thư mục cấu hình). Nếu plugin không cần cấu hình thì phải xóa thư mục tự tạo. - Thư mục cấu hình plugin chỉ hỗ trợ:
app.php(cấu hình chính),bootstrap.php(khởi động tiến trình),route.php(định tuyến),middleware.php(middleware),process.php(tiến trình tùy chỉnh),database.php(cơ sở dữ liệu),redis.php(Redis),thinkorm.php(thinkorm). webman tự nhận diện các file này. - Truy cập cấu hình:
config('plugin.vendor.tên plugin.file cấu hình.mục');, ví dụconfig('plugin.webman.push.app.app_key'). - Nếu plugin có cấu hình cơ sở dữ liệu riêng:
illuminate/databasedùngDb::connection('plugin.vendor.tên plugin.kết nối'),thinkormdùngDb::connect('plugin.vendor.tên plugin.kết nối'). - Nếu plugin cần đặt file nghiệp vụ trong
app/thì phải tránh xung đột với dự án chính và plugin khác. - Plugin nên tránh sao chép file hoặc thư mục sang dự án chính. Ví dụ plugin cross-origin chỉ sao chép cấu hình; file middleware để trong
vendor/webman/cros/src. - Khuyến nghị dùng PascalCase cho namespace của plugin, ví dụ
Webman/Console.
Ví dụ
Cài đặt webman/console dòng lệnh
composer require webman/console
Tạo plugin
Giả sử tên plugin cần tạo là foo/admin (cũng là tên dự án sẽ phát hành trên Composer, phải viết thường). Chạy:
php webman plugin:create --name=foo/admin
Sẽ tạo vendor/foo/admin (file plugin) và config/plugin/foo/admin (cấu hình).
Ghi chú
config/plugin/foo/adminhỗ trợ:app.php,bootstrap.php,route.php,middleware.php,process.php,database.php,redis.php,thinkorm.php. Định dạng giống webman, tự động merge.
Truy cập dùng tiền tốplugin, ví dụconfig('plugin.foo.admin.app').
Xuất plugin
Sau khi phát triển xong, chạy:
php webman plugin:export --name=foo/admin
Xuất
Giải thích
Khi xuất sẽ sao chépconfig/plugin/foo/adminvàovendor/foo/admin/srcvà tạoInstall.php, chạy khi cài đặt/gỡ bỏ.
Cài đặt mặc định: sao chép cấu hình từvendor/foo/admin/srcvàoconfig/plugincủa dự án.
Gỡ bỏ mặc định: xóa file cấu hình plugin trongconfig/plugincủa dự án.
Có thể sửaInstall.phpđể thêm logic tùy chỉnh khi cài đặt/gỡ bỏ.
Gửi plugin
- Giả sử bạn đã có tài khoản GitHub và Packagist.
- Tạo repository
admintrên GitHub và đẩy mã nguồn, ví dụhttps://github.com/ten-dang-nhap/admin. - Truy cập
https://github.com/ten-dang-nhap/admin/releases/newtạo release, ví dụv1.0.0. - Trên Packagist bấm
Submit, gửihttps://github.com/ten-dang-nhap/adminđể phát hành plugin.
Mẹo
Nếu Packagist báo trùng tên thì chọn vendor khác, ví dụ đổifoo/adminthànhmyfoo/admin.
Khi cập nhật: đẩy mã nguồn lên GitHub, tạo release mới tại https://github.com/ten-dang-nhap/admin/releases/new, rồi bấm Update tại https://packagist.org/packages/foo/admin.
Thêm lệnh cho plugin
Một số plugin cần lệnh tùy chỉnh. Ví dụ cài webman/redis-queue thì dự án có lệnh redis-queue:consumer. Chạy php webman redis-queue:consumer send-mail sẽ nhanh chóng tạo lớp consumer SendMail.php, hỗ trợ phát triển.
Để thêm lệnh foo-admin:add cho plugin foo/admin:
Tạo lệnh
Tạo file 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 = 'Mô tả lệnh';
/**
* @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;
}
}
Ghi chú
Để tránh xung đột lệnh giữa các plugin, dùng định dạngvendor-plugin:lệnh. Ví dụ mọi lệnh của pluginfoo/adminphải có tiền tốfoo-admin:, ví dụfoo-admin:add.
Thêm cấu hình
Tạo config/plugin/foo/admin/command.php
<?php
use Foo\Admin\FooAdminAddCommand;
return [
FooAdminAddCommand::class,
// Thêm thêm nếu cần...
];
Mẹo
command.phpdùng để đăng ký lệnh tùy chỉnh của plugin. Mỗi phần tử là một lớp lệnh.webman/consoletự động tải. Xem thêm Lệnh console.
Chạy xuất
Chạy php webman plugin:export --name=foo/admin để xuất plugin và phát hành lên Packagist. Sau khi cài foo/admin sẽ có lệnh foo-admin:add. Chạy php webman foo-admin:add jerry sẽ in Admin add jerry.