Plug-ins d'application

Chaque plug-in d'application est une application complète, dont le code source est placé dans le répertoire {projet principal}/plugin.

Conseil
Utilisez la commande php webman app-plugin:create {nom du plug-in} pour créer un plug-in d'application localement,
par exemple php webman app-plugin:create cms va créer la structure de répertoire suivante :

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

Nous pouvons constater qu'un plug-in d'application a la même structure de répertoires et les mêmes fichiers de configuration que webman. En réalité, développer un plug-in d'application est essentiellement identique à développer un projet webman, il suffit de prêter attention aux points suivants.

Espace de noms

Le répertoire et la nomenclature des plug-ins suivent la norme PSR4, étant donné que les plug-ins sont tous placés dans le répertoire plugin, l'espace de noms commence par plugin, par exemple plugin\cms\app\controller\UserController, où cms est le répertoire principal du code source du plug-in.

Accès URL

L'URL des plug-ins d'application commence par /app, par exemple, l'URL pour plugin\cms\app\controller\UserController est http://127.0.0.1:8787/app/cms/user.

Fichiers statiques

Les fichiers statiques sont placés dans plugin/{plug-in}/public, par exemple, accéder à http://127.0.0.1:8787/app/cms/avatar.png revient à obtenir le fichier plugin/cms/public/avatar.png.

Fichier de configuration

La configuration des plug-ins est semblable à celle d'un projet webman ordinaire, mais généralement, la configuration des plug-ins n'affecte que le plug-in actuel et n'a pas d'impact sur le projet principal.
Par exemple, la valeur de plugin.cms.app.controller_suffix n'affecte que le suffixe des contrôleurs du plug-in et n'impacte pas le projet principal.
Par exemple, la valeur de plugin.cms.app.controller_reuse n'affecte que le fait que le plug-in réutilise des contrôleurs, et n'impacte pas le projet principal.
Par exemple, la valeur de plugin.cms.middleware n'affecte que le middleware du plug-in, et n'impacte pas le projet principal.
Par exemple, la valeur de plugin.cms.view n'affecte que la vue utilisée par le plug-in, et n'impacte pas le projet principal.
Par exemple, la valeur de plugin.cms.container n'affecte que le conteneur utilisé par le plug-in, et n'impacte pas le projet principal.
Par exemple, la valeur de plugin.cms.exception n'affecte que la classe de gestion des exceptions du plug-in, et n'impacte pas le projet principal.

Cependant, comme les routes sont globales, les routes configurées dans le plug-in affectent également l'ensemble.

Obtention de configuration

La méthode pour obtenir la configuration d'un plug-in est config('plugin.{plug-in}.{configuration spécifique}');, par exemple, pour obtenir toutes les configurations de plugin/cms/config/app.php, la méthode est config('plugin.cms.app').
De même, le projet principal ou d'autres plug-ins peuvent utiliser config('plugin.cms.xxx') pour obtenir la configuration du plug-in cms.

Configuration non supportée

Les plug-ins d'application ne supportent pas les configurations server.php, session.php, et ne supportent pas app.request_class, app.public_path, app.runtime_path.

Base de données

Les plug-ins peuvent configurer leur propre base de données, par exemple, le contenu de plugin/cms/config/database.php est le suivant :

return  [
    'default' => 'mysql',
    'connections' => [
        'mysql' => [ // mysql est le nom de la connexion
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'base_de_données',
            'username'    => 'nom_d_utilisateur',
            'password'    => 'mot_de_passe',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
        'admin' => [ // admin est le nom de la connexion
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'base_de_données',
            'username'    => 'nom_d_utilisateur',
            'password'    => 'mot_de_passe',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
    ],
];

La méthode de citation est Db::connection('plugin.{plug-in}.{nom de connexion}');, par exemple :

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

Si vous souhaitez utiliser la base de données du projet principal, utilisez-la directement, par exemple :

use support\Db;
Db::table('user')->first();
// Supposons que le projet principal ait également configuré une connexion admin
Db::connection('admin')->table('admin')->first();

Conseil
thinkorm fonctionne de la même manière.

Redis

L'utilisation de Redis est similaire à celle de la base de données, par exemple 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,
    ],
];

Utilisation :

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

De même, si vous souhaitez réutiliser la configuration Redis du projet principal :

use support\Redis;
Redis::get('key');
// Supposons que le projet principal ait également configuré une connexion cache
Redis::connection('cache')->get('key');

Journal

L'utilisation de la classe de journal est également semblable à celle de la base de données :

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

Si vous souhaitez réutiliser la configuration de journal du projet principal, utilisez-la directement :

use support\Log;
Log::info('contenu du journal');
// Supposons que le projet principal ait une configuration de journal test
Log::channel('test')->info('contenu du journal');

Installation et désinstallation des plug-ins d'application

Pour installer un plug-in d'application, il suffit de copier le répertoire du plug-in dans le répertoire {projet principal}/plugin, un reload ou un restart est nécessaire pour que cela prenne effet.
Pour désinstaller, il suffit de supprimer le répertoire du plug-in correspondant dans {projet principal}/plugin.