Aplicativo de Plugin
Cada aplicativo de plugin é um aplicativo completo, com o código-fonte localizado no diretório {projeto_principal}/plugin.
Dica
Use o comandophp webman app-plugin:create {nome_do_plugin}para criar um aplicativo de plugin localmente,
por exemplo,php webman app-plugin:create cmscriará a seguinte estrutura de diretórios:
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
Podemos ver que um aplicativo de plugin possui a mesma estrutura de diretórios e arquivos de configuração que o webman. Na verdade, desenvolver um aplicativo de plugin é uma experiência praticamente idêntica à de desenvolver um projeto webman, bastando observar os seguintes aspectos.
Namespace
Os diretórios e nomes dos plugins seguem a norma PSR4, e como os plugins estão localizados no diretório plugin, os namespaces começam com plugin, por exemplo, plugin\cms\app\controller\UserController, onde cms é o diretório principal do código-fonte do plugin.
Acesso via URL
Os caminhos de URL dos aplicativos de plugin começam com /app, por exemplo, a URL para plugin\cms\app\controller\UserController é http://127.0.0.1:8787/app/cms/user.
Arquivos Estáticos
Os arquivos estáticos estão localizados em plugin/{plugin}/public, por exemplo, acessar http://127.0.0.1:8787/app/cms/avatar.png na verdade obtém o arquivo plugin/cms/public/avatar.png.
Arquivos de Configuração
As configurações dos plugins são semelhantes às de um projeto webman normal, mas geralmente são válidas apenas para o plugin atual e não afetam o projeto principal.
Por exemplo, o valor de plugin.cms.app.controller_suffix afeta apenas o sufixo do controlador do plugin, sem impacto no projeto principal.
Da mesma forma, valores como plugin.cms.app.controller_reuse, plugin.cms.middleware, plugin.cms.view e plugin.cms.container têm efeitos somente no plugin, sem afetar o projeto principal.
Contudo, como as rotas são globais, as rotas configuradas para o plugin também impactam globalmente.
Obtendo Configurações
O método para obter a configuração de um plugin é config('plugin.{plugin}.{configurações_detalhadas}');, por exemplo, para obter todas as configurações do plugin/cms/config/app.php o método seria config('plugin.cms.app').
Da mesma forma, o projeto principal ou outros plugins podem usar config('plugin.cms.xxx') para acessar as configurações do plugin cms.
Configurações Não Suportadas
Os plugins de aplicativo não suportam as configurações server.php, session.php, nem suportam app.request_class, app.public_path e app.runtime_path.
Banco de Dados
Os plugins podem configurar seu próprio banco de dados, por exemplo, o conteúdo de plugin/cms/config/database.php é o seguinte:
return [
'default' => 'mysql',
'connections' => [
'mysql' => [ // mysql é o nome da conexão
'driver' => 'mysql',
'host' => '127.0.0.1',
'port' => 3306,
'database' => 'banco_de_dados',
'username' => 'nome_de_usuário',
'password' => 'senha',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_general_ci',
],
'admin' => [ // admin é o nome da conexão
'driver' => 'mysql',
'host' => '127.0.0.1',
'port' => 3306,
'database' => 'banco_de_dados',
'username' => 'nome_de_usuário',
'password' => 'senha',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_general_ci',
],
],
];
A forma de citação é Db::connection('plugin.{plugin}.{nome_da_conexão}');, por exemplo:
use support\Db;
Db::connection('plugin.cms.mysql')->table('user')->first();
Db::connection('plugin.cms.admin')->table('admin')->first();
Se quiser usar o banco de dados do projeto principal, basta usá-lo diretamente, por exemplo:
use support\Db;
Db::table('user')->first();
// Supondo que o projeto principal também configurou uma conexão admin
Db::connection('admin')->table('admin')->first();
Dica
thinkorm também utiliza uma abordagem semelhante.
Redis
O uso do Redis é semelhante ao do banco de dados, por exemplo, 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,
],
];
Ao usar:
use support\Redis;
Redis::connection('plugin.cms.default')->get('key');
Redis::connection('plugin.cms.cache')->get('key');
Da mesma forma, se quiser reutilizar a configuração do Redis do projeto principal:
use support\Redis;
Redis::get('key');
// Supondo que o projeto principal também configurou uma conexão cache
Redis::connection('cache')->get('key');
Logs
O uso da classe de logs também é semelhante ao do banco de dados:
use support\Log;
Log::channel('plugin.admin.default')->info('teste');
Se quiser reutilizar a configuração de log do projeto principal, basta usar diretamente:
use support\Log;
Log::info('conteúdo do log');
// Supondo que o projeto principal possui uma configuração de log denominada test
Log::channel('test')->info('conteúdo do log');
Instalação e Desinstalação de Aplicativos Plugin
Para instalar um aplicativo de plugin, basta copiar o diretório do plugin para {projeto_principal}/plugin, sendo necessário um reload ou restart para que as mudanças tenham efeito.
Para desinstalar, basta excluir o diretório correspondente do plugin em {projeto_principal}/plugin.