Proceso de generación y publicación de plugins básicos

Principio

  1. Tomando como ejemplo un plugin de CORS, el plugin se divide en tres partes: un archivo de programa middleware de CORS, un archivo de configuración middleware.php y un Install.php que se genera automáticamente por un comando.
  2. Utilizamos un comando para empaquetar los tres archivos y publicarlos en Composer.
  3. Cuando un usuario instala el plugin de CORS utilizando Composer, el Install.php copia el archivo del programa middleware de CORS y el archivo de configuración a la ruta {proyecto_principal}/config/plugin, lo que permite que Webman los cargue. Esto hace que la configuración del archivo middleware de CORS se active automáticamente.
  4. Cuando el usuario elimina el plugin utilizando Composer, el Install.php elimina el archivo del programa middleware de CORS y el archivo de configuración correspondientes, lo que permite desinstalar el plugin automáticamente.

Normas

  1. El nombre del plugin consta de dos partes: fabricante y nombre_del_plugin, por ejemplo webman/push, que corresponde al nombre del paquete en Composer.
  2. Los archivos de configuración del plugin deben ubicarse en config/plugin/fabricante/nombre_del_plugin/ (el comando de consola creará automáticamente el directorio de configuración). Si el plugin no requiere configuración, se debe eliminar el directorio de configuración creado automáticamente.
  3. El directorio de configuración del plugin solo admite app.php como configuración principal del plugin, bootstrap.php para la configuración de inicio de procesos, route.php para la configuración de rutas, middleware.php para la configuración del middleware, process.php para la configuración de procesos personalizados, database.php para la configuración de base de datos, redis.php para la configuración de Redis y thinkorm.php para la configuración de thinkorm. Estas configuraciones serán reconocidas automáticamente por Webman.
  4. El plugin puede obtener la configuración de la siguiente manera: config('plugin.fabricante.nombre_del_plugin.archivo_de_configuración.elemento_de_configuración');, por ejemplo config('plugin.webman.push.app.app_key').
  5. Si el plugin tiene su propia configuración de base de datos, debe accederse de la siguiente manera. illuminate/database sería Db::connection('plugin.fabricante.nombre_del_plugin.conexión_específica'), thinkrom sería Db::connct('plugin.fabricante.nombre_del_plugin.conexión_específica').
  6. Si el plugin necesita colocar archivos comerciales en el directorio app/, debe asegurarse de que no haya conflictos con el proyecto del usuario y otros plugins.
  7. El plugin debe evitar en la medida de lo posible copiar archivos o directorios al proyecto principal; por ejemplo, en el caso de un plugin de CORS, además de copiar el archivo de configuración al proyecto principal, el archivo middleware debe colocarse en vendor/webman/cros/src, sin necesidad de copiarlo al proyecto principal.
  8. Se sugiere que el espacio de nombres del plugin use mayúsculas, como Webman/Console.

Ejemplo

Instalación del comando webman/console

composer require webman/console

Crear un plugin

Supongamos que el nombre del plugin que se va a crear es foo/admin (el nombre es el mismo que el del proyecto que se va a publicar más adelante en Composer, y debe estar en minúsculas).
Ejecuta el comando:
php webman plugin:create --name=foo/admin

Después de crear el plugin, se generará el directorio vendor/foo/admin para almacenar los archivos relacionados con el plugin y config/plugin/foo/admin para almacenar la configuración relacionada con el plugin.

Nota
config/plugin/foo/admin admite las siguientes configuraciones: app.php como configuración principal del plugin, bootstrap.php para la configuración de inicio de procesos, route.php para la configuración de rutas, middleware.php para la configuración del middleware, process.php para la configuración de procesos personalizados, database.php para la configuración de base de datos, redis.php para la configuración de Redis y thinkorm.php para la configuración de thinkorm. El formato de configuración es el mismo que en Webman, y estas configuraciones serán reconocidas y se fusionarán automáticamente en la configuración por Webman.
Para acceder se usa el prefijo plugin, por ejemplo, config('plugin.foo.admin.app');.

Exportar el plugin

Una vez que hemos terminado de desarrollar el plugin, ejecutamos el siguiente comando para exportar el plugin:
php webman plugin:export --name=foo/admin
Exportar

Nota
Al exportar, se copiará el directorio config/plugin/foo/admin a vendor/foo/admin/src, al mismo tiempo que se generará automáticamente un Install.php. El Install.php se utiliza para realizar algunas operaciones al instalar y desinstalar automáticamente.
La operación predeterminada de instalación es copiar la configuración de vendor/foo/admin/src al directorio config/plugin del proyecto actual.
La operación predeterminada al eliminar es eliminar los archivos de configuración en el directorio config/plugin del proyecto actual.
Puede modificar el Install.php para realizar operaciones personalizadas al instalar y desinstalar el plugin.

Publicar el plugin

  • Supongamos que ya tienes cuentas en github y packagist.
  • Crea un proyecto admin en github y sube el código; supongamos que la dirección del proyecto es https://github.com/tu_usuario/admin.
  • Ve a https://github.com/tu_usuario/admin/releases/new y publica un release como v1.0.0.
  • Dirígete a packagist y haz clic en Submit en la navegación, luego envía la dirección de tu proyecto en GitHub: https://github.com/tu_usuario/admin, de esta forma habrás completado la publicación de un plugin.

Sugerencia
Si al enviar el plugin en packagist aparece un conflicto de nombres, puedes elegir un nuevo nombre para el fabricante, por ejemplo, cambiar foo/admin a myfoo/admin.

Cuando el código de tu proyecto de plugin se actualice, deberás sincronizar el código en GitHub y volver a acceder a la dirección https://github.com/tu_usuario/admin/releases/new para volver a publicar un release, luego dirígete a https://packagist.org/packages/foo/admin y haz clic en el botón Update para actualizar la versión.

Añadir comandos al plugin

A veces nuestros plugins necesitan algunos comandos personalizados para proporcionar algunas funciones auxiliares, por ejemplo, después de instalar el plugin webman/redis-queue, el proyecto añadirá automáticamente un comando redis-queue:consumer, que permite al usuario ejecutar php webman redis-queue:consumer send-mail creando una clase consumidora SendMail.php en el proyecto, lo que ayuda al desarrollo rápido.

Supongamos que el plugin foo/admin necesita añadir el comando foo-admin:add, sigue los pasos a continuación.

Crear un nuevo comando

Crear el archivo 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 = 'Descripción del comando aquí';

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

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

}

Nota
Para evitar conflictos entre comandos de plugins, se sugiere que el formato del comando sea fabricante-nombre_del_plugin:comando_específico, por ejemplo, todos los comandos del plugin foo/admin deberían tener el prefijo foo-admin:, como foo-admin:add.

Añadir configuración

Crear la configuración config/plugin/foo/admin/command.php

<?php

use Foo\Admin\FooAdminAddCommand;

return [
    FooAdminAddCommand::class,
    // ....se pueden añadir múltiples configuraciones...
];

Sugerencia
command.php se utiliza para configurar comandos personalizados para el plugin; cada elemento del arreglo corresponde a un archivo de clase de comando, y cada archivo de clase corresponde a un comando. Cuando el usuario ejecuta la línea de comando, webman/console cargará automáticamente cada comando personalizado configurado en command.php de los plugins. Para más información sobre comandos de línea, consulta línea de comando.

Ejecutar la exportación

Ejecuta el comando php webman plugin:export --name=foo/admin para exportar el plugin y luego envíalo a packagist. De esta manera, cuando un usuario instale el plugin foo/admin, se añadirá un comando foo-admin:add. Ejecutar php webman foo-admin:add jerry imprimirá Admin agregar jerry.