Processo de Geração e Publicação de Plugins Básicos

Princípio

  1. Tomando o plugin de cross-domain como exemplo, o plugin é dividido em três partes: um arquivo de programa middleware de cross-domain, um arquivo de configuração de middleware middleware.php e um Install.php que é gerado automaticamente por meio de um comando.
  2. Usamos um comando para empacotar os três arquivos e publicá-los no Composer.
  3. Quando um usuário instala o plugin de cross-domain usando o Composer, o Install.php copia o arquivo de programa middleware de cross-domain e o arquivo de configuração para {projeto principal}/config/plugin, permitindo que o Webman o carregue. Isso resulta na configuração automática do arquivo middleware de cross-domain.
  4. Quando um usuário remove o plugin usando o Composer, o Install.php excluirá o respectivo arquivo de programa middleware de cross-domain e o arquivo de configuração, realizando a desinstalação automática do plugin.

Normas

  1. O nome do plugin consiste em duas partes, fornecedor e nome do plugin, por exemplo, webman/push, que corresponde ao nome do pacote do Composer.
  2. Os arquivos de configuração do plugin devem ser uniformemente armazenados em config/plugin/fornecedor/nome-do-plugin/ (o comando do console criará automaticamente o diretório de configuração). Se o plugin não requer configuração, o diretório de configuração criado automaticamente deve ser removido.
  3. O diretório de configuração do plugin suporta apenas app.php para a configuração principal do plugin, bootstrap.php para configuração de inicialização do processo, route.php para configuração de rotas, middleware.php para configuração de middleware, process.php para configuração de processos personalizados, database.php para configuração do banco de dados, redis.php para configuração do Redis e thinkorm.php para configuração do ThinkORM. Essas configurações serão automaticamente reconhecidas pelo Webman.
  4. O plugin usa o seguinte método para obter configurações: config('plugin.fornecedor.nome-do-plugin.arquivo-de-configuração.item-de-configuração-específica');, por exemplo, config('plugin.webman.push.app.app_key').
  5. Se o plugin possui suas próprias configurações de banco de dados, elas devem ser acessadas da seguinte forma. illuminate/database deve ser Db::connection('plugin.fornecedor.nome-do-plugin.conexão específica'), thinkrom deve ser Db::connct('plugin.fornecedor.nome-do-plugin.conexão específica').
  6. Se o plugin precisa instalar arquivos de negócios no diretório app/, deve-se garantir que não haja conflitos com o projeto do usuário nem com outros plugins.
  7. O plugin deve evitar ao máximo copiar arquivos ou diretórios para o projeto principal; por exemplo, os arquivos de middleware do plugin de cross-domain devem ser armazenados em vendor/webman/cros/src e não precisam ser copiados para o projeto principal, exceto pelos arquivos de configuração.
  8. É recomendado que o namespace do plugin utilize letras maiúsculas, por exemplo, Webman/Console.

Exemplo

Instalação do comando webman/console

composer require webman/console

Criar Plugin

Suponha que o nome do plugin criado seja foo/admin (o nome deve ser em letras minúsculas, pois será o nome do projeto a ser publicado no Composer mais tarde). Execute o comando:
php webman plugin:create --name=foo/admin

Após a criação do plugin, será gerado o diretório vendor/foo/admin para armazenar os arquivos relacionados ao plugin e config/plugin/foo/admin para armazenar as configurações relacionadas ao plugin.

Atenção
config/plugin/foo/admin suporta as seguintes configurações: app.php para configuração principal do plugin, bootstrap.php para configuração de inicialização do processo, route.php para configuração de rotas, middleware.php para configuração de middleware, process.php para configuração de processos personalizados, database.php para configuração do banco de dados, redis.php para configuração do Redis e thinkorm.php para configuração do ThinkORM. O formato de configuração é o mesmo que o do Webman e essas configurações serão automaticamente reconhecidas e mescladas nas configurações. Acesse usando o prefixo plugin, por exemplo, config('plugin.foo.admin.app');

Exportar Plugin

Após desenvolver o plugin, execute o seguinte comando para exportá-lo:
php webman plugin:export --name=foo/admin
Exportação

Nota
Após a exportação, o diretório config/plugin/foo/admin será copiado para vendor/foo/admin/src, ao mesmo tempo em que um Install.php será gerado automaticamente; o Install.php é utilizado para realizar algumas operações automaticamente durante a instalação e desinstalação.
A operação padrão de instalação é copiar as configurações do diretório vendor/foo/admin/src para o diretório config/plugin do projeto atual.
A remoção padrão é deletar os arquivos de configuração do diretório config/plugin do projeto atual.
Você pode modificar o Install.php para realizar operações personalizadas durante a instalação e desinstalação do plugin.

Submeter Plugin

  • Suponha que você já tenha uma conta no github e packagist.
  • Crie um projeto admin no github e faça o upload do código. O endereço do projeto é, hipoteticamente, https://github.com/seu-usuario/admin.
  • Acesse o endereço https://github.com/seu-usuario/admin/releases/new e publique um release como v1.0.0.
  • Acesse o packagist, clique em Submit na navegação e envie o endereço do seu projeto do Github https://github.com/seu-usuario/admin, completando assim a publicação do plugin.

Dica
Se ao submeter o plugin no packagist aparecer um conflito de nomes, você pode alterar o nome do fornecedor, por exemplo, mudar foo/admin para myfoo/admin.

Quando o código do seu projeto de plugin for atualizado, você precisará sincronizar o código com o Github e acessar novamente o endereço https://github.com/seu-usuario/admin/releases/new para publicar um novo release. Em seguida, vá para a página https://packagist.org/packages/foo/admin e clique no botão Update para atualizar a versão.

Adicionar Comandos ao Plugin

Às vezes, precisamos adicionar alguns comandos personalizados ao nosso plugin para fornecer funcionalidades auxiliares. Por exemplo, após instalar o plugin webman/redis-queue, o projeto adicionará automaticamente um comando redis-queue:consumer, e o usuário poderá executar php webman redis-queue:consumer send-mail que gerará uma classe consumidora SendMail.php no projeto, facilitando o desenvolvimento rápido.

Suponha que o plugin foo/admin precise adicionar o comando foo-admin:add, siga as etapas abaixo.

Criar Comando

Criar o arquivo de comando 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 = 'Aqui está a descrição do comando';

    /**
     * @return void
     */
    protected function configure()
    {
        $this->addArgument('name', InputArgument::REQUIRED, 'Adicionar nome');
    }

    /**
     * @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;
    }

}

Atenção
Para evitar conflitos entre comandos de plugins, recomenda-se que o formato do comando seja fornecedor-nome-do-plugin:comando específico, por exemplo, todos os comandos do plugin foo/admin devem ter o prefixo foo-admin:, como em foo-admin:add.

Adicionar Configuração

Criar a configuração config/plugin/foo/admin/command.php

<?php

use Foo\Admin\FooAdminAddCommand;

return [
    FooAdminAddCommand::class,
    // ....pode adicionar múltiplas configurações...
];

Dica
O command.php serve para configurar comandos personalizados para o plugin; cada elemento do array corresponde a uma classe de comando. Quando o usuário executa a linha de comando, o webman/console carregará automaticamente os comandos personalizados configurados em command.php de cada plugin. Para saber mais sobre comandos de linha, consulte Comando de Linha.

Executar Exportação

Execute o comando php webman plugin:export --name=foo/admin para exportar o plugin e submetê-lo ao packagist. Assim, quando um usuário instalar o plugin foo/admin, um comando foo-admin:add será adicionado. Ao executar php webman foo-admin:add jerry, a saída será Admin add jerry.