Plugin dell'Applicazione

Ogni plugin dell'applicazione è un'applicazione completa, il codice sorgente è posizionato nella directory {progetto_principale}/plugin

Suggerimento
Utilizzando il comando php webman app-plugin:create {nome_plugin} è possibile creare un plugin dell'applicazione in locale,
per esempio php webman app-plugin:create cms creerà la seguente struttura di directory

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

Possiamo osservare che un plugin dell'applicazione ha una struttura di directory e file di configurazione simile a quella di webman. In effetti, sviluppare un plugin dell'applicazione è praticamente lo stesso che sviluppare un progetto webman, è sufficiente prestare attenzione ai seguenti aspetti.

Namespace

La directory e il naming dei plugin seguono le specifiche PSR4, poiché i plugin sono posizionati nella directory plugin, tutti gli namespace iniziano con plugin, ad esempio plugin\cms\app\controller\UserController, qui cms è la directory principale del codice sorgente del plugin.

Accesso URL

Gli URL dei plugin dell'applicazione iniziano tutti con /app, ad esempio l'URL per plugin\cms\app\controller\UserController è http://127.0.0.1:8787/app/cms/user.

File Statici

I file statici sono posizionati sotto plugin/{plugin}/public, ad esempio l'accesso a http://127.0.0.1:8787/app/cms/avatar.png in realtà recupera il file plugin/cms/public/avatar.png.

File di Configurazione

La configurazione del plugin è simile a quella di un normale progetto webman, tuttavia la configurazione del plugin generalmente è valida solo per il plugin attuale e non influisce sul progetto principale.
Ad esempio, il valore di plugin.cms.app.controller_suffix influisce solo sul suffisso del controller del plugin e non sul progetto principale.
Ad esempio, il valore di plugin.cms.app.controller_reuse influisce solo sul fatto che il plugin riutilizzi o meno i controller, senza influenza sul progetto principale.
Ad esempio, il valore di plugin.cms.middleware influisce solo sul middleware del plugin, senza influenza sul progetto principale.
Ad esempio, il valore di plugin.cms.view influisce solo sulle viste utilizzate dal plugin, senza influenza sul progetto principale.
Ad esempio, il valore di plugin.cms.container influisce solo sul contenitore utilizzato dal plugin, senza influenza sul progetto principale.
Ad esempio, il valore di plugin.cms.exception influisce solo sulla classe di gestione delle eccezioni del plugin, senza influenza sul progetto principale.

Tuttavia, poiché le rotte sono globali, le rotte configurate nei plugin influenzano anche globalmente.

Ottenere la Configurazione

Il metodo per ottenere la configurazione di un plugin è config('plugin.{plugin}.{configurazione_specifica}');, ad esempio, per ottenere tutte le configurazioni di plugin/cms/config/app.php si utilizza config('plugin.cms.app').
Allo stesso modo, il progetto principale o altri plugin possono utilizzare config('plugin.cms.xxx') per ottenere la configurazione del plugin cms.

Configurazioni Non Supportate

I plugin dell'applicazione non supportano la configurazione di server.php, session.php, non supportano app.request_class, app.public_path, app.runtime_path.

Database

I plugin possono configurare il proprio database, ad esempio il contenuto di plugin/cms/config/database.php è il seguente

return  [
    'default' => 'mysql',
    'connections' => [
        'mysql' => [ // mysql è il nome della connessione
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'database',
            'username'    => 'username',
            'password'    => 'password',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
        'admin' => [ // admin è il nome della connessione
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'database',
            'username'    => 'username',
            'password'    => 'password',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
    ],
];

Il metodo di riferimento è Db::connection('plugin.{plugin}.{nome_connessione}');, ad esempio

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

Se si desidera utilizzare il database del progetto principale, si utilizza direttamente, per esempio

use support\Db;
Db::table('user')->first();
// Supponendo che il progetto principale abbia configurato anche una connessione admin
Db::connection('admin')->table('admin')->first();

Suggerimento
thinkorm ha anche un'analoga modalità d'uso

Redis

L'uso di Redis è simile a quello del database, per esempio in 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,
    ],
];

In uso

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

Allo stesso modo, se si desidera riutilizzare la configurazione Redis del progetto principale

use support\Redis;
Redis::get('key');
// Supponendo che il progetto principale abbia anche configurato una connessione cache
Redis::connection('cache')->get('key');

Log

L'uso della classe Log è anch'esso simile all'uso del database

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

Se si desidera riutilizzare la configurazione del log del progetto principale, si utilizza direttamente

use support\Log;
Log::info('contenuto del log');
// Supponendo che il progetto principale abbia una configurazione di log test
Log::channel('test')->info('contenuto del log');

Installazione e Disinstallazione del Plugin dell'Applicazione

Per installare un plugin dell'applicazione è sufficiente copiare la directory del plugin nella directory {progetto_principale}/plugin, è necessario eseguire il reload o il restart per renderlo efficace.
Per disinstallare, è sufficiente eliminare la directory del plugin corrispondente sotto {progetto_principale}/plugin.