Quy trình tạo và phát hành plugin cơ bản

Nguyên lý

  1. Lấy plugin cross-domain làm ví dụ, plugin chia thành ba phần: một là tệp chương trình middleware cross-domain, một là tệp cấu hình middleware.php, và một là Install.php được tạo tự động thông qua lệnh.
  2. Chúng tôi sử dụng lệnh để đóng gói ba tệp và phát hành tới composer.
  3. Khi người dùng cài đặt plugin cross-domain bằng composer, tệp Install.php trong plugin sẽ sao chép tệp chương trình middleware cross-domain và tệp cấu hình vào {dự án chính}/config/plugin để webman tải lên. Điều này giúp cấu hình tự động có hiệu lực cho tệp middleware cross-domain.
  4. Khi người dùng xóa plugin bằng composer, Install.php sẽ xóa tệp chương trình middleware cross-domain và tệp cấu hình tương ứng, thực hiện việc gỡ cài đặt plugin tự động.

Qui định

  1. Tên plugin bao gồm hai phần, nhà cung cấptên plugin, ví dụ như webman/push, cái này tương ứng với tên gói composer.
  2. Tệp cấu hình plugin phải được đặt trong thư mục config/plugin/nhà cung cấp/tên plugin/ (lệnh console sẽ tự động tạo thư mục cấu hình). Nếu plugin không cần cấu hình, cần phải xóa thư mục cấu hình được tạo tự động.
  3. Thư mục cấu hình plugin chỉ hỗ trợ app.php cho cấu hình chính của plugin, bootstrap.php cho cấu hình khởi động quy trình, route.php cho cấu hình định tuyến, middleware.php cho cấu hình middleware, process.php cho cấu hình quy trình tùy chỉnh, database.php cho cấu hình cơ sở dữ liệu, redis.php cho cấu hình redis, thinkorm.php cho cấu hình thinkorm. Những cấu hình này sẽ tự động được webman nhận diện.
  4. Plugin sử dụng phương thức sau để lấy cấu hình config('plugin.nhà cung cấp.tên plugin.tệp cấu hình.các mục cấu hình cụ thể');, ví dụ config('plugin.webman.push.app.app_key')
  5. Nếu plugin có cấu hình cơ sở dữ liệu riêng, nó có thể truy cập theo cách sau. illuminate/database cho Db::connection('plugin.nhà cung cấp.tên plugin.cuộc kết nối cụ thể'), thinkrom cho Db::connct('plugin.nhà cung cấp.tên plugin.cuộc kết nối cụ thể')
  6. Nếu plugin cần đặt tệp nghiệp vụ trong thư mục app/, cần đảm bảo không xung đột với dự án của người dùng cũng như các plugin khác.
  7. Plugin nên cố gắng tránh việc sao chép tệp hoặc thư mục vào dự án chính, ví dụ như plugin cross-domain, ngoài các tệp cấu hình cần sao chép vào dự án chính, tệp middleware nên được đặt trong vendor/webman/cros/src mà không cần sao chép vào dự án chính.
  8. Không gian tên của plugin được khuyên dùng chữ hoa, ví dụ như Webman/Console.

Ví dụ

Cài đặt lệnh dòng webman/console

composer require webman/console

Tạo plugin

Giả sử plugin được tạo có tên là foo/admin (tên này cũng là tên dự án sẽ được phát hành vào composer, tên cần viết thường)
Chạy lệnh
php webman plugin:create --name=foo/admin

Sau khi tạo plugin, sẽ tạo ra thư mục vendor/foo/admin để lưu trữ các tệp liên quan đến plugin và config/plugin/foo/admin để lưu trữ cấu hình liên quan đến plugin.

Chú ý
config/plugin/foo/admin hỗ trợ các cấu hình sau, cấu hình chính app.php, cấu hình khởi động quy trình bootstrap.php, cấu hình định tuyến route.php, cấu hình middleware.php, cấu hình quy trình tùy chỉnh process.php, cấu hình cơ sở dữ liệu database.php, cấu hình redis redis.php, cấu hình thinkorm thinkorm.php. Định dạng cấu hình giống với webman, những cấu hình này sẽ tự động được webman nhận diện và hợp nhất vào cấu hình.
Khi sử dụng, có tiền tố plugin ví dụ như config('plugin.foo.admin.app');

Xuất plugin

Khi chúng tôi đã phát triển xong plugin, thực hiện lệnh sau để xuất plugin
php webman plugin:export --name=foo/admin
Xuất

Giải thích
Sau khi xuất ra sẽ sao chép thư mục config/plugin/foo/admin vào vendor/foo/admin/src, đồng thời tự động tạo ra một tệp Install.php, Install.php dùng để thực hiện một số thao tác khi cài đặt và gỡ cài đặt tự động.
Thao tác mặc định khi cài đặt là sao chép cấu hình từ vendor/foo/admin/src vào thư mục hiện tại project config/plugin
Khi xóa, thao tác mặc định là xóa tệp cấu hình trong thư mục hiện tại project config/plugin
Bạn có thể sửa đổi Install.php để thực hiện một số thao tác tùy chỉnh khi cài đặt và gỡ cài đặt plugin.

Nộp plugin

  • Giả sử bạn đã có tài khoản githubpackagist
  • Tạo một dự án admin trên github và tải mã lên, địa chỉ dự án giả sử là https://github.com/tên người dùng của bạn/admin
  • Truy cập địa chỉ https://github.com/tên người dùng của bạn/admin/releases/new phát hành một bản phát hành như v1.0.0
  • Truy cập packagist nhấp vào phần điều hướng Submit, Đưa địa chỉ dự án github của bạn https://github.com/tên người dùng của bạn/admin lên, như vậy là bạn đã hoàn thành việc phát hành một plugin.

Mẹo
Nếu việc nộp plugin trên packagist hiển thị mâu thuẫn về chữ, bạn có thể đổi thành một tên nhà cung cấp khác, như foo/admin đổi thành myfoo/admin

Sau này khi mã nguồn dự án plugin của bạn có bản cập nhật, cần đồng bộ mã lên github, và lại truy cập địa chỉ https://github.com/tên người dùng của bạn/admin/releases/new để phát hành lại một bản mới, sau đó đến trang https://packagist.org/packages/foo/admin nhấn nút Update để cập nhật phiên bản.

Thêm lệnh cho plugin

Đôi khi plugin của chúng ta cần một số lệnh tùy chỉnh để cung cấp các chức năng hỗ trợ, ví dụ như sau khi cài đặt plugin webman/redis-queue, dự án sẽ tự động thêm một lệnh redis-queue:consumer, người dùng chỉ cần chạy php webman redis-queue:consumer send-mail sẽ tạo ra một lớp tiêu thụ SendMail.php trong dự án, điều này giúp phát triển nhanh chóng.

Giả sử plugin foo/admin cần thêm lệnh foo-admin:add, theo các bước dưới đây.

Tạo lệnh mới

Tạo tệp lệnh mới 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 = 'Đây là mô tả lệnh dòng';

    /**
     * @return void
     */
    protected function configure()
    {
        $this->addArgument('name', InputArgument::REQUIRED, 'Thêm tên');
    }

    /**
     * @param InputInterface $input
     * @param OutputInterface $output
     * @return int
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $name = $input->getArgument('name');
        $output->writeln("Admin thêm $name");
        return self::SUCCESS;
    }

}

Chú ý
Để tránh xung đột lệnh giữa các plugin, định dạng lệnh được khuyên dùng là nhà cung cấp-tên plugin:lệnh cụ thể, ví dụ, tất cả các lệnh của plugin foo/admin nên có tiền tố foo-admin:, ví dụ như foo-admin:add.

Thêm cấu hình

Tạo cấu hình mới config/plugin/foo/admin/command.php

<?php

use Foo\Admin\FooAdminAddCommand;

return [
    FooAdminAddCommand::class,
    // ....có thể thêm nhiều cấu hình...
];

Mẹo
command.php được sử dụng để cấu hình lệnh tùy chỉnh cho plugin, mỗi phần tử trong mảng tương ứng với một tệp lớp lệnh dòng, mỗi tệp lớp tương ứng với một lệnh. Khi người dùng chạy lệnh dòng, webman/console sẽ tự động tải tất cả các lệnh tùy chỉnh trong command.php của từng plugin. Muốn tìm hiểu thêm về các lệnh dòng, vui lòng tham khảo lệnh dòng

Thực hiện xuất

Thực hiện lệnh php webman plugin:export --name=foo/admin để xuất plugin và gửi lên packagist. Như vậy sau khi người dùng cài đặt plugin foo/admin, sẽ có thêm một lệnh foo-admin:add. Thực hiện php webman foo-admin:add jerry sẽ in ra Admin thêm jerry