Possibile con PHP MVC Framework? Una soluzione migliore per l''override' del client delle funzionalità di base?

3

Sfondo / Il problema

Ho bisogno di creare un'applicazione (grande) con un certo insieme di funzionalità core e alcune funzionalità per più client al suo interno. Ogni cliente ha diversi requisiti e mentre possono condividere alcune funzionalità, ho bisogno di separare il codice per ogni cliente, quindi una modifica a uno non influenzerà gli altri. Ogni sezione client dell'applicazione dovrebbe anche ereditare alcune funzionalità dall'applicazione principale. Idealmente mi piacerebbe separare i database per ogni cliente. In termini di un sistema utente, gli utenti core dovrebbero essere in grado di accedere alle funzionalità di ciascun client, ma gli utenti client dovrebbero essere in grado di interagire con la loro specifica sezione client del sito.

Soluzione corrente

Ogni client ha il proprio sottodominio e MVC può sovrascrivere i file MVC del core SE esistono. In poche parole, il caricatore automatico MVC personalizzato controlla la directory del client per il file M, V o C corrispondente quando un sottodominio è presente nell'URL e carica il file del client specifico INSTEAD del file principale. È un'abilità di override in un certo senso.

Domande

  1. Sto risolvendo questo problema in un modo che sarebbe considerato una buona pratica in termini di progettazione del software?

  2. Se dovessi utilizzare un framework PHP esistente (mi piacerebbe), come potrei andare a configurarlo per risolvere questo problema? Nello specifico ho cercato Yii e CodeIgniter.

Grazie in anticipo!

Aggiornamento: Ho scoperto un modello di progettazione chiamato HMVC (Hierarchical MVC) e sembra essere essenzialmente quello che ho descritto. Vedo che Kohana 3 è stato creato usando questo codice e che Codeigniter ha un'estensione che lo consente.

    
posta Austen Cameron 06.02.2013 - 21:24
fonte

3 risposte

1

Questo può o non può essere di qualche utilità per te, ma guarda "Bundle Inheritance" di Symfony 2. Ti consente di sostituire le funzionalità dei pacchetti distribuiti a livello di applicazione.

Se hai sviluppato la tua funzionalità di base in un pacchetto, puoi implementare più applicazioni e eseguire l'override. Mantieni sincronizzato il core bundle tramite il controllo della versione e un repository Composer e le uniche cose che differirebbero tra queste applicazioni sarebbero le modifiche specifiche del client.

La rovina di questo approccio è che gestisci applicazioni distribuite N , che non sono esattamente amichevoli. Probabilmente potresti forgiare Symfony 2 e modificare il programma di caricamento classe in modo che sia sensibile al client in modo da poter avere più cartelle client nella distribuzione dell'applicazione. Dovrebbe essere un fork relativamente semplice, quindi mantenere aggiornato Symfony sarebbe banale.

    
risposta data 10.02.2013 - 16:30
fonte
0

Quello che vuoi è una forma di iniezione delle dipendenze.

Prova le classi simboliche:

namespace Core;
class X { }
class Y { }

namespace MrSmith\Core;
class X extends \Core\X { } // extend specific core class for Mr. Smith

define('CLIENT_NAME','MrSmith');
$x = new \Sym\Core\X();
$y = new \Sym\Core\Y();

Chiedi al caricatore automatico di visualizzare "Sym" nello spazio dei nomi e carica \MrSmith\Core\X e poi crea un alias con \Sym\Core\X .

Quindi tenta lo stesso con \Sym\Core\Y , non ne trova uno per Mr. Smith e torna a \Core\Y .

In questo modo devi solo definire le deviazioni per ogni client, con ogni client nella propria sandbox.

Se stai distribuendo il sistema assegnando a ogni client una copia e sono già in modalità sandbox nel proprio sottodominio / root dei documenti, puoi saltare usando CLIENT_NAME e guardarlo in una directory "Sym", e usa "Sym" come spazio dei nomi invece di "MrSmith".

    
risposta data 22.05.2013 - 01:27
fonte
0

Lavorare con CakePHP ma fattibile in molti sistemi diversi che sono in grado di sviluppare alcuni plugin.

Ciò che facciamo è sviluppare innanzitutto le funzionalità di base dei plug-in. Ad esempio: funzionalità di gestione degli utenti. Questo plugin è memorizzato su GitHub come repository separato.

Creiamo una configurazione generale dell'applicazione, ovvero file come index.php, file css di esempio, ecc. Per ogni client, installa questa configurazione di base e inizia a caricare i plug-in per ottenere le funzionalità desiderate.

Quindi in GitHub hai:

Template Application (index.php / example css file / pluginloader)
Plugin 1 (users management)
Plugin 2 (accounting)
etc.

L'applicazione client può essere completamente personalizzata e utilizzare le funzionalità del plugin come desiderato.

Quindi, per andare oltre, puoi persino sovrascrivere una singola vista di un plugin. Esempio di questo può essere trovato qui: link

Se vuoi, puoi ottenere la copia del modello e poi spingerlo come nuovo repository su GitHub in modo da ottenere alla fine tutti i repository separati caricati insieme.

Template Application (index.php / example css file / pluginloader)
Plugin 1 (users management)
Plugin 2 (accounting)
Plugin 3 (custom feature for Client 1 - link to their production site)
etc.
Client 1 (you're first copy of template)
Client 2 (the second copy of template)

La cosa bella è che hai moduli separati che possono essere testati separatamente, riutilizzati ecc.

    
risposta data 21.06.2013 - 10:21
fonte