Aplicación de Plugins

Cada aplicación de plugin es una aplicación completa, y el código fuente se coloca en el directorio {proyecto_principal}/plugin.

Sugerencia
Utilizando el comando php webman app-plugin:create {nombre_del_plugin} se puede crear un plugin de aplicación localmente.
Por ejemplo, php webman app-plugin:create cms creará la siguiente estructura de directorios:

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 observar que un plugin de aplicación tiene la misma estructura de directorios y archivos de configuración que webman. En realidad, desarrollar un plugin de aplicación es similar a desarrollar un proyecto webman, solo necesita tener en cuenta los siguientes aspectos.

Espacio de Nombres

La estructura y nomenclatura de los plugin siguen la norma PSR4. Debido a que los plugins se colocan en el directorio plugin, los espacios de nombres comienzan con plugin, por ejemplo, plugin\cms\app\controller\UserController, donde cms es el directorio principal del código fuente del plugin.

Acceso a la URL

La ruta de acceso a la URL de los plugins de aplicación comienza con /app, por ejemplo, la URL de plugin\cms\app\controller\UserController es http://127.0.0.1:8787/app/cms/user.

Archivos Estáticos

Los archivos estáticos se colocan en plugin/{plugin}/public. Por ejemplo, acceder a http://127.0.0.1:8787/app/cms/avatar.png realmente obtiene el archivo plugin/cms/public/avatar.png.

Archivos de Configuración

La configuración de los plugins es similar a la de un proyecto webman normal, sin embargo, la configuración de los plugins generalmente solo tiene efecto en el plugin actual y no afecta al proyecto principal.
Por ejemplo, el valor de plugin.cms.app.controller_suffix solo afecta al sufijo del controlador del plugin y no impacta al proyecto principal.
El valor de plugin.cms.app.controller_reuse solo afecta si el plugin reutiliza controladores, sin impacto en el proyecto principal.
El valor de plugin.cms.middleware solo afecta a los middleware del plugin, sin impacto en el proyecto principal.
El valor de plugin.cms.view solo afecta a las vistas utilizadas por el plugin, sin impacto en el proyecto principal.
El valor de plugin.cms.container solo afecta al contenedor utilizado por el plugin, sin efecto en el proyecto principal.
El valor de plugin.cms.exception solo afecta a la clase de manejo de excepciones del plugin, sin impacto en el proyecto principal.

Sin embargo, dado que las rutas son globales, las rutas configuradas por el plugin también afectan al ámbito global.

Obtener Configuración

El método para obtener la configuración de un plugin es config('plugin.{plugin}.{configuración_específica}');. Por ejemplo, para obtener toda la configuración de plugin/cms/config/app.php, el método es config('plugin.cms.app').
Del mismo modo, el proyecto principal o otros plugins pueden utilizar config('plugin.cms.xxx') para obtener la configuración del plugin cms.

Configuraciones No Soportadas

Los plugins de aplicación no soportan configuraciones server.php, session.php, ni app.request_class, app.public_path, app.runtime_path.

Base de Datos

Los plugins pueden configurar su propia base de datos, por ejemplo, el contenido de plugin/cms/config/database.php es como sigue:

return  [
    'default' => 'mysql',
    'connections' => [
        'mysql' => [ // mysql es el nombre de la conexión
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'base_de_datos',
            'username'    => 'nombre_de_usuario',
            'password'    => 'contraseña',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
        'admin' => [ // admin es el nombre de la conexión
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'base_de_datos',
            'username'    => 'nombre_de_usuario',
            'password'    => 'contraseña',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
    ],
];

La forma de referencia es Db::connection('plugin.{plugin}.{nombre_de_conexión}');, por ejemplo:

use support\Db;
Db::connection('plugin.cms.mysql')->table('user')->first();
Db::connection('plugin.cms.admin')->table('admin')->first();

Si deseas utilizar la base de datos del proyecto principal, simplemente usa:

use support\Db;
Db::table('user')->first();
// Suponga que el proyecto principal también ha configurado una conexión admin
Db::connection('admin')->table('admin')->first();

Sugerencia
thinkorm también tiene un uso similar.

Redis

El uso de Redis es similar al de la base de datos, por ejemplo, en 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,
    ],
];

Al usar:

use support\Redis;
Redis::connection('plugin.cms.default')->get('key');
Redis::connection('plugin.cms.cache')->get('key');

Del mismo modo, si deseas reutilizar la configuración de Redis del proyecto principal:

use support\Redis;
Redis::get('key');
// Suponga que el proyecto principal también ha configurado una conexión cache
Redis::connection('cache')->get('key');

Logs

El uso de la clase de logs también es similar al de la base de datos:

use support\Log;
Log::channel('plugin.admin.default')->info('test');

Si deseas reutilizar la configuración de logs del proyecto principal, simplemente usa:

use support\Log;
Log::info('contenido del log');
// Suponga que el proyecto principal tiene una configuración de log test
Log::channel('test')->info('contenido del log');

Instalación y Desinstalación de Plugins de Aplicación

Para instalar un plugin de aplicación, solo es necesario copiar el directorio del plugin en el directorio {proyecto_principal}/plugin, y necesitarás un reload o restart para que tenga efecto.
Para desinstalar, simplemente elimina el directorio correspondiente al plugin en {proyecto_principal}/plugin.