Applicazione divisa in moduli

Salve a tutti,

è la mia prima domanda qui, ho provato già a cercare ma non ho trovato quello che mi interessava. Se mi fosse sfuggito, chiedo subito scusa.

Premetto che sono relativamente nuovo a Zend Framework, ma non nuovo a PHP.

Allora, la domanda è questa: supponiamo di voler strutturare un'applicazione dividendola in moduli. In che modo Questi si gestiscono? In rete ho trovato qualche esempio e tutorial, ma per ora non mi sono chiari. Nel senso, in che modo io dico all'applicazione che un modulo esiste e deve essere lui ad occuparsi di una certa funzione del programma? Ovvero, come lo registro nell'applicazione globale?

Seconda cosa, più difficile: c'è modo di creare un'applicazione modulare con i moduli che si possono attivare o disattivare a piacere? Faccio un esempio: supponiamo di voler scrivere un generico backend di un piccolo sito web (non importa che sia un vero cms). L'obiettivo è creare un sito di admin che semplicemente scriva su database, senza occuparsi di creare un layout grafico del sito. Lasciamo che l'applicazione di default gestisca solo l'accesso al backend, e poi demandiamo a due moduli separati la gestione di:

- gallerie fotografiche

- notizie

L'obiettivo sarebbe quello di ottenere un'applicazione finale dove la gestione delle gallerie e delle notizie siano separate, in modo tale che questo backend si possa usare per costruire un sito dove ci interessano solo le foto, uno dove ci interessano solo le notizie, o uno dove ci interessano entrambe, senza dover rimettere mano al codice di continuo. In pratica sarebbe utile poter "accendere" o "spegnere" un modulo semplicemente includendolo nella cartella dei moduli.

è possivile ottenere una cosa del genere?

Grazie in anticipo.

inviato 5 anni fa
canemacchina
Nel tuo progetto utilizzi il componente Zend_Application? Hai creato la struttura del progetto con il tool da riga di comando "zf"?Gianni Tomasicchio 5 anni fa
X 1 X

Se vuoi realizzare un'interfaccia web (o a linea di comando) per gestire i tuoi moduli (cioè con il layout di un'applicazione modulare dello Zend Framework, e.g. models, views, views/scripts, controllers, etc.) hai bisogno di lavorare un piccolo file manager a scopo limitato.

Il problema non è complesso, se si riflette bene su quello che si vuole fare si capisce subito che è sufficiente (DoTheSimplestThingThatCouldPossiblyWork) listare il contenuto della cartella modules per avere la lista dei moduli!

Si parte quindi lavorando con il File System per recuperare il nome delle cartelle dei moduli della tua applicazione. Considerando ogni sottocartella di modules come un modulo si può fare qualcosa così:

<?php
/* moduli.php */

define('APPLICATION_PATH', '/var/www/zf-app/application');
$modules = new FileSystemIterator(APPLICATION_PATH . '/modules');
foreach ($modules as $module) {
    printf("Modulo: %s\n", $module->getFileName());
}

Per ottenere maggiori informazioni sul modulo è necessario aggiungere dei metadati al suo interno. Non importa quale formato si vuole utilizzare, e.g., doc-blocks, file di testo, ini, xml, yaml, array php, l'importate è determinare quali dati sono necessari all'applicazione per riconoscere e gestire il modulo e metterli in un file.

Si puo usare davvero qualsiasi cosa ma generalmente la scelta si contende sempre tra ini, xml e yaml.
Per semplificare l'implementazione dei metadata file andrà bene il formato ini e considerando che in questo caso si tratta di un'applicazione Zend Framework una delle soluzioni più semplici e ovvie da utilizzare fa proprio parte del framework.

Raccogliendo le informazioni all'interno di un file ini saranno facilmente recuperabili, con Zend_Config, per essere utilizzate nell'applicazione. Con questi metadati si può, ad esempio, popolare una tabella del database contenente il nome, la versione e lo stato del modulo, e.g., installato, non installato, out of date.

; modules/first-module/metadata.ini

module.author   = "Cthulu"
module.version  = "1.0"
module.name     = "admin-panel"
module.longName = "Administration Panel"

Estendendo l'esempio precedente perché vada a leggere il metadata file di ogni modulo e stampi il nome e l'autore

<?php
/* moduli.php */

require 'Zend/Config/Ini.php';
define('APPLICATION_PATH', '/var/www/zf-app/application');

$modules = new FileSystemIterator(APPLICATION_PATH . '/modules');

foreach ($modules as $module) {
    $metadataFile = sprintf("%s/metadata.ini", $module->getPathName());
    $reader = new Zend_Config_Ini($metadataFile);

    printf("%s creato da %s\n", $reader->module->name,
                                $reader->module->author);
}

Il discorso si può ulteriormente estendere con l'aggiunta di script di setup/teardown per i moduli, funzionalità web per l'upload e la rimozione dei moduli, esporre API per semplificare l'interazione tra modulo applicazione.

risposto 5 anni fa
Andrea Turso
Andrea Turso
86
modificato 5 anni fa
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda