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à