Come usare i packages di Laravel in un plugin di OctoberCMS

Luca Benati

Una guida rapida su come includere facilmente i packages di Laravel in un progetto October


Pubblicato da Luca Benati il 27 aprile 2020

In questo articolo vediamo come utilizzare i packages di Laravel nel nostro plugin sviluppato per OcrtoberCMS registrando service providers alias e configurazioni in pochi semplici passi facilmente intgrabili nei nostri plugin.

Intanto partiamo dall'individuare il pacchetto che fà al caso nostro quindi procediamo ad installarlo nel nostro plugin.

Per il nostro esempio utilizzeremo il packages HTMLPurifier for Laravel.

Ci rechiamo quindi nella root del nostro plugin e lo aggiungiamo al nostro conposer.json ed eseguiamo composer update



{
    "require": {
        "laravel/framework": "~5.0",
        "mews/purifier": "~3.0",
    }
}

Oppure direttamente con il comando



composer require mews/purifier

Fatto questo ora il pacchetto non è ancora utilizzabile, prima dobbiamo resgistrare il service provider e l'alias, per fare questo creiamo la cartella config nella root del plugin se ancora non esiste e creiamo un file config.php dove andremo ad inserire il seguente contenuto


return [
    // Questo conterrà i pacchetti Laravel che vogliamo che il plugin utilizzi elencati sotto i loro identificativi
    'packages' => [
        'mews/purifier' => [
            // Service providers che sarà registrato dal plugin
            'providers' => [
                '\Mews\Purifier\PurifierServiceProvider',
            ],

            // Aliases che saranno registratidal plugin nel formato $alias => $percorsoAllaFacade
            'aliases' => [
                'Purifier' => '\Mews\Purifier\Facades\Purifier',
            ],

            // Il namespace col quale settare la configurazioneThe namespace to set the configuration under. Per questo esempio si accederà alla configurazione di questo pacchetto attraverso config('purifier.' . $chiave) quindi il namespace 'purifier' è quell oche noi imposteremo qui
            'config_namespace' => 'purifier',

            // Questa è la configurazione del pacchetto stesso, inizialmente è una copia dei valori di default del pacchetto che possono venire modificati secondo le nostre necessità anche in un secondo momento.
            'config' => [
                'encoding'      => 'UTF-8',
                'finalize'      => true,
                'cachePath'     => storage_path('app/purifier'),
                'cacheFileMode' => 0755,
                'settings'      => [
                    'default' => [
                        'HTML' => [
                            'Doctype'             => 'XHTML 1.0 Strict',
                            'Allowed'             => 'div,b,strong,i,em,a[href|title],ul,ol,li,p[style],br,span[style],img[width|height|alt|src]',
                        ],
                        'CSS'  => [
                            'AllowedProperties'   => 'font,font-size,font-weight,font-style,font-family,text-decoration,padding-left,color,background-color,text-align',
                        ],
                        'AutoFormat' => [
                            'AutoParagraph' => true,
                            'RemoveEmpty'   => true,
                        ],
                    ],
                    'test'    => [
                        'Attr' => ['EnableID' => true]
                    ],
                    "youtube" => [
                        "HTML" => ["SafeIframe" => 'true'],
                        "URI"  => ["SafeIframeRegexp" => "%^(http://|https://|//)(www.youtube.com/embed/|player.vimeo.com/video/)%"],
                    ],
                ],
            ],
        ],
    ],
];

Ora tutti i pacchetti che andremo ad aggiungere sotto la chiave 'packages' verranno caricati automaticamente da lnostro plugin, perchè questo accada manca ancora un passaggio cioè andare a definire la funzione che si occuperà di leggere le informazioni inserite nel nel file sotto la voce packages.

Nel file Plugin.php creiamo un nuovo metodo chiamato bootPackages che si occuperà di quanto detto sopra andando a leggere la definizione del/dei packages e registrarli senza dimenticarci prima di includere le facades necessarie subito dopo la dichiarazione del namsepace



use App;
use Config;
use Illuminate\Foundation\AliasLoader;

public function bootPackages()
{
    // Otteniamo il namespace del plugin corrente per accedere alla sua configurazione
    $pluginNamespace = str_replace('\\', '.', strtolower(__NAMESPACE__));

    // Instanziamo l'Alialoader per tutti gli alias che saranno caricati
    $aliasLoader = AliasLoader::getInstance();

    // Otteniamo tutti i packages  
    $packages = Config::get($pluginNamespace . '::packages');

    // Facciamo i lboot per ogni package
    foreach ($packages as $name => $options) {
        // Impostamo la configurazione del package prendendo la configurazione dal plugin corrente
        if (!empty($options['config']) && !empty($options['config_namespace'])) {
            Config::set($options['config_namespace'], $options['config']);
        }

        // Registriamo tutti i service providers del package
        if (!empty($options['providers'])) {
            foreach ($options['providers'] as $provider) {
                App::register($provider);
            }
        }

        // Registriamo tutti gli alias del package
        if (!empty($options['aliases'])) {
            foreach ($options['aliases'] as $alias => $path) {
                $aliasLoader->alias($alias, $path);
            }
        }
    }
}

Come si vede il metodo non fà altro che ciclare su ogni package inserito sotto la chiave packages del file config e registrarne i service provider gli alias e settarne la configurazione.

Per eseguire queste operazioni quando il nostro plugin sarà installato ed attivato richiamiamo questa funzione chiamandola tramite l'override del metodo boot sempre nel file Plugin.php in questo modo



public function boot()
{

    $this->bootPackages();

}

Ora avremo il pacchetto disponibile e perfettamente funzionante nel nostro plugin ad esempio



Purifier::clean(Input::get('nomeinput'));

Questo è tutto, ringraziamo Luke Towers per questa comoda soluzione.

Questo è tutto.

Happy coding!


Lunga vita e prosperità

Ti interessa un argomento non trattato?