Ho una "sequenza di attività" da intraprendere su un file zip. Può essere semplificato in questi passaggi:
- Convalida che il file è un file ZIP ed è valido
- Decomprimi il file
- Convalidare i contenuti come previsto
- Trasforma il contenuto in un prodotto
Attualmente sto usando il pattern Command e sembra un po 'come questo
interface Command {
public function execute($data);
}
class ValidateFile implements Command {
public function execute($filePath) { //... }
}
class UnzipFile implements Command {
public function execute($filePath) { //... }
}
class ValidateContents implements Command {
public function execute($unzippedFilePath) { //... }
}
class ProductGenerator implements Command {
public function execute($unzippedFilePath) { //... }
}
Ora, ognuno di questi comandi di esecuzione restituisce una stringa che è a sua volta (dal comando invoker) passata al comando successivo nella catena (definito dalla configurazione).
Ho due problemi qui:
-
Ogni comando richiede le sue dipendenze, ovvero decomprimere l'accesso a ZipArchive, una classe che gestisce la decompressione dei file zip. Come faccio a iniettare le dipendenze di ciascun comando? Sono abbastanza felice di aggirare questo istanziando tutti i comandi attraverso un DIC e inserendoli in un "Invoker" che accetta oggetti istanziati di tipo Command, li esegue in sequenza, tuttavia non sembra giusto.
-
(Altro di un problema) Come faccio a mantenere più di una stringa tra i comandi? Ho visto in luoghi persone che passano un oggetto "contesto" da un comando a un altro, tuttavia questo sembra un po 'sporco in quanto il comando dipenderebbe da un'interfaccia non tipizzata (essenzialmente avvolgono un array associativo). Ha senso che deve essere non tipizzato, come se tu dovessi mantenere un'interfaccia tra i comandi, quindi il contesto non può implementare metodi specifici che potrebbero dissuadere dalla sua astrazione.
Gradirei qualsiasi consiglio su come affrontare entrambi questi problemi.
Modifica: un altro problema che ho è che ognuno di questi comandi è in realtà accoppiato allo stato del percorso del file che è passato ad esso, sono abbastanza specifici per il caso in questione, ma dubito che sia possibile lavorare oltre quello .