Plugins d'application
Chaque plugin d'application est une application complète dont le code source est placé dans le répertoire {projet principal}/plugin
Astuce
En utilisant la commandephp webman app-plugin:create {nom du plugin}
(nécessite webman/console>=1.2.16), vous pouvez créer localement un plugin d'application.
Par exemple,php webman app-plugin:create cms
créera 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 voyons qu'un plugin d'application a la même structure de répertoire et les mêmes fichiers de configuration que webman. En réalité, le développement d'un plugin d'application est pratiquement identique au développement d'un projet webman, il suffit de faire attention à quelques aspects.
Espace de noms
Les répertoires et noms des plugins suivent la spécification PSR4. Comme tous les plugins sont placés dans le répertoire plugin, les espaces de noms commencent tous par plugin, par exemple plugin\cms\app\controller\UserController
, où cms est le répertoire principal du code source du plugin.
Accès URL
Les adresses URL des plugins d'application commencent toutes par /app
, par exemple pour le contrôleur plugin\cms\app\controller\UserController
, l'URL est http://127.0.0.1:8787/app/cms/user
.
Fichiers statiques
Les fichiers statiques sont placés dans plugin/{plugin}/public
. Par exemple, accéder à http://127.0.0.1:8787/app/cms/avatar.png
revient en réalité à récupérer le fichier plugin/cms/public/avatar.png
.
Fichiers de configuration
La configuration des plugins est identique à celle des projets webman, mais généralement la configuration d'un plugin n'a d'impact que sur ce plugin et non sur le projet principal.
Par exemple, la valeur de plugin.cms.app.controller_suffix
n'a d'impact que sur le suffixe des contrôleurs du plugin et n'a aucun impact sur le projet principal.
De même, la valeur de plugin.cms.app.controller_reuse
n'a d'impact que sur la réutilisation des contrôleurs du plugin et non sur le projet principal.
Il en va de même pour les autres configurations telles que middleware
ou view
qui n'ont d'effet que sur le plugin auquel elles sont associées.
Cependant, comme les routes sont globales, la configuration des routes du plugin affecte également l'ensemble du système.
Obtenir la configuration
Pour obtenir la configuration d'un plugin spécifique, utilisez la méthode suivante : config('plugin.{plugin}.{configuration spécifique}');
, par exemple pour obtenir toutes les configurations de plugin/cms/config/app.php
, utilisez config('plugin.cms.app')
.
De la même manière, le projet principal ou d'autres plugins peuvent utiliser config('plugin.cms.xxx')
pour obtenir la configuration du plugin cms.
Configurations non prises en charge
Les plugins d'application ne prennent pas en charge les configurations server.php
, session.php
, app.request_class
, app.public_path
et app.runtime_path
.
Base de données
Les plugins peuvent avoir leur propre configuration de 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' => 'database',
'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' => 'database',
'username' => 'nom d'utilisateur',
'password' => 'mot de passe',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_general_ci',
],
],
];
Pour l'utiliser, utilisez Db::connection('plugin.{plugin}.{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 dispose également d'une connexion admin
Db::connection('admin')->table('admin')->first();
Astuce
thinkorm fonctionne de manière similaire
Redis
L'utilisation de Redis est similaire à celle de la base de données. Par exemple, pour 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,
],
];
L'utilisation se fait ainsi :
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 a également configuré une connexion cache
Redis::connection('cache')->get('key');
Journalisation
L'utilisation de la journalisation est similaire à 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 journalisation du projet principal, utilisez simplement :
use support\Log;
Log::info('Contenu du journal');
// Supposons que le projet principal a configuré un journal test
Log::channel('test')->info('Contenu du journal');
Installation et désinstallation des plugins d'application
Lors de l'installation d'un plugin d'application, il suffit de copier le répertoire du plugin dans le répertoire {projet principal}/plugin
, puis de recharger ou redémarrer pour que les modifications prennent effet.
Pour désinstaller un plugin, il suffit de supprimer le répertoire du plugin correspondant dans {projet principal}/plugin
.