Processus de génération et de publication de plugins de base

Principe

  1. Prenons l'exemple d'un plugin Cross-Domain, le plugin se divise en trois parties : un fichier de programme middleware Cross-Domain, un fichier de configuration middleware.php et un Install.php généré automatiquement par commande.
  2. Nous utilisons une commande pour empaqueter et publier les trois fichiers sur composer.
  3. Lorsque l'utilisateur installe le plugin Cross-Domain via composer, le fichier Install.php copie le fichier de programme middleware Cross-Domain ainsi que le fichier de configuration dans {projet principal}/config/plugin, permettant à webman de les charger. Cela permet de configurer automatiquement le fichier middleware Cross-Domain.
  4. Lorsque l'utilisateur désinstalle ce plugin via composer, Install.php supprime le fichier de programme middleware Cross-Domain et le fichier de configuration correspondants, permettant une désinstallation automatique du plugin.

Normes

  1. Le nom du plugin est constitué de deux parties : fournisseur et nom du plugin, par exemple webman/push, qui correspond au nom du package composer.
  2. Les fichiers de configuration des plugins doivent être placés dans config/plugin/fournisseur/nom_du_plugin/ (la commande console créera automatiquement ce répertoire de configuration). Si le plugin n'a pas besoin de configuration, il faut supprimer le répertoire de configuration créé automatiquement.
  3. Le répertoire de configuration des plugins ne supporte que app.php pour la configuration principale du plugin, bootstrap.php pour la configuration de démarrage des processus, route.php pour la configuration des routes, middleware.php pour la configuration des middlewares, process.php pour la configuration des processus personnalisés, database.php pour la configuration de la base de données, redis.php pour la configuration redis et thinkorm.php pour la configuration thinkorm. Ces configurations seront automatiquement reconnues par webman.
  4. Le plugin utilise la méthode suivante pour obtenir sa configuration config('plugin.fournisseur.nom_du_plugin.fichier_de_configuration.configuration_spécifique');, par exemple config('plugin.webman.push.app.app_key').
  5. Si le plugin a sa propre configuration de base de données, elle peut être accédée de la manière suivante. illuminate/database sera Db::connection('plugin.fournisseur.nom_du_plugin.connexion_spécifique'), thinkrom sera Db::connect('plugin.fournisseur.nom_du_plugin.connexion_spécifique').
  6. Si le plugin doit placer des fichiers métier dans le répertoire app/, il doit s'assurer qu'il n'y a pas de conflit avec le projet de l'utilisateur et d'autres plugins.
  7. Les plugins devraient éviter de copier des fichiers ou répertoires dans le projet principal, par exemple, pour le plugin Cross-Domain, à part le fichier de configuration qui doit être copié dans le projet principal, le fichier middleware devrait être placé dans vendor/webman/cros/src et ne devrait pas être copié dans le projet principal.
  8. Il est conseillé d'utiliser un espace de noms avec des majuscules pour les plugins, par exemple Webman/Console.

Exemple

Installation de la ligne de commande webman/console

composer require webman/console

Création d'un plugin

Supposons que le plugin que nous créons s'appelle foo/admin (le nom est également le nom du projet à publier sur composer, il doit être en minuscules).
Exécutez la commande
php webman plugin:create --name=foo/admin

Après la création du plugin, un répertoire vendor/foo/admin sera généré pour stocker les fichiers liés au plugin et config/plugin/foo/admin pour stocker la configuration du plugin.

Attention
config/plugin/foo/admin prend en charge les configurations suivantes : app.php pour la configuration principale du plugin, bootstrap.php pour la configuration de démarrage des processus, route.php pour la configuration des routes, middleware.php pour la configuration des middlewares, process.php pour la configuration des processus personnalisés, database.php pour la configuration de la base de données, redis.php pour la configuration redis et thinkorm.php pour la configuration thinkorm. Le format de configuration est le même que celui de webman, ces configurations seront automatiquement reconnues et fusionnées dans la configuration.
Accédez en utilisant le préfixe plugin, par exemple config('plugin.foo.admin.app');

Exportation du plugin

Une fois que nous avons développé le plugin, exécutons la commande suivante pour l'exporter.
php webman plugin:export --name=foo/admin
Exporter

Remarque
L'exportation copiera le répertoire config/plugin/foo/admin dans vendor/foo/admin/src, tout en générant automatiquement un Install.php, Install.php sert à exécuter certaines opérations lors de l'installation et de la désinstallation automatiques.
L'opération par défaut lors de l'installation est de copier la configuration du répertoire vendor/foo/admin/src vers current projet config/plugin.
Lors de la suppression, l'opération par défaut est de supprimer les fichiers de configuration de current projet config/plugin.
Vous pouvez modifier Install.php pour effectuer certaines opérations personnalisées lors de l'installation et de la désinstallation du plugin.

Soumettre le plugin

  • Supposons que vous disposiez d'un compte github et packagist
  • Créez un projet admin sur github et téléchargez le code, l'adresse du projet est supposée être https://github.com/votre_nom_d_utilisateur/admin.
  • Allez à l'adresse https://github.com/votre_nom_d_utilisateur/admin/releases/new pour publier une release comme v1.0.0.
  • Allez sur packagist et cliquez sur 'Soumettre' dans la navigation, soumettez votre adresse du projet github https://github.com/votre_nom_d_utilisateur/admin, ainsi vous aurez terminé la publication d'un plugin.

Astuce
Si lors de la soumission du plugin sur packagist, cela indique un conflit de texte, vous pouvez choisir un autre nom de fournisseur, par exemple changer foo/admin en myfoo/admin.

À l'avenir, lorsque votre code de plugin est mis à jour, vous devez synchroniser le code avec github, puis accédez à l'adresse https://github.com/votre_nom_d_utilisateur/admin/releases/new pour publier à nouveau une release, puis allez sur https://packagist.org/packages/foo/admin et cliquez sur le bouton Mise à jour pour mettre à jour la version.

Ajouter des commandes au plugin

Parfois, notre plugin a besoin de certaines commandes personnalisées pour fournir des fonctionnalités auxiliaires, par exemple, après l'installation du plugin webman/redis-queue, le projet ajoutera automatiquement une commande redis-queue:consumer, l'utilisateur n'a qu'à exécuter php webman redis-queue:consumer send-mail pour générer une classe de consommateur SendMail.php dans le projet, ce qui facilite le développement rapide.

Supposons que le plugin foo/admin doive ajouter la commande foo-admin:add, suivez les étapes ci-dessous.

Créer une nouvelle commande

Créer le fichier de commande 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 = 'Description de la ligne de commande ici';

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

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

}

Attention
Pour éviter les conflits de commandes entre les plugins, il est conseillé que le format de la ligne de commande soit fournisseur-nom_du_plugin:commande_spécifique, par exemple, toutes les commandes du plugin foo/admin devraient avoir le préfixe foo-admin:, comme foo-admin:add.

Ajouter une configuration

Créer la configuration config/plugin/foo/admin/command.php

<?php

use Foo\Admin\FooAdminAddCommand;

return [
    FooAdminAddCommand::class,
    // ....vous pouvez ajouter plusieurs configurations...
];

Astuce
command.php sert à configurer des commandes personnalisées pour le plugin, chaque élément du tableau correspond à un fichier de classe de commande, chaque fichier de classe correspondant à une commande. Lorsque l'utilisateur exécute une ligne de commande, webman/console chargera automatiquement chaque commande personnalisée définie dans le command.php du plugin. Pour en savoir plus sur les lignes de commande, veuillez consulter lignes de commande.

Exécuter l'exportation

Exécutez la commande php webman plugin:export --name=foo/admin pour exporter le plugin et soumettez-le à packagist. De cette manière, lorsque l'utilisateur installera le plugin foo/admin, une commande foo-admin:add sera ajoutée. Exécutez php webman foo-admin:add jerry pour afficher Admin ajouter jerry.