Modo moderno di riscrivere i file lib


21

Il problema è ben noto: le libclassi vengono caricate esclusivamente tramite il caricatore automatico e non possiamo cambiarle se non:

  • Copiandoli interamente in un codePool che è controllato prima di lib.
  • Installazione del PSR-0 caricatore automatico , specificando una classmap autoload, e poi copiare il file del tutto in quella struttura delle cartelle, invece. [la mia soluzione attuale]

Sono in una situazione difficile perché voglio potenzialmente toccare molti di questi file, ma per motivi di sanità mentale e stabilità / aggiornabilità del negozio non voglio copiare intere classi di biblioteche.

Ora, ovviamente, ci sono potenziali soluzioni a questo problema, ma tutte presentano un proprio insieme di problemi:

  • Vai alla AOP percorso e utilizzare una libreria PHP-based come Go! AOP : L'ultima volta che ho controllato questo richiederà che le classi Magento vengano caricate dal caricatore automatico del compositore, non solo una disponibile. Flyingmana ha svolto alcuni lavori in questo settore, ma sicuramente non è pronto per l'uso in produzione e le mie esigenze sono più immediate. Voglio anche spedire come estensione e ciò richiederebbe una maggiore configurazione del compositore.
  • Segui la strada AOP e usa un'estensione PHP nativa : probabilmente la più favorevole a questo punto, ma richiederebbe l'installazione di un'estensione separata, per non parlare del fatto che non funzionerebbe con HHVM.
  • Usa il classkit e / o il runkit di PHP: è un'altra estensione nativa di PHP, quindi ha lo stesso problema di cui sopra.
  • Patch chiama i siti per usare la mia \Danslo\Varien_Xversione namespace ( ), quindi estendi dall'originale ( \Varien_X): ci sono troppi callites da patchare e richiederebbe una quantità stupida di riscritture. Non è un'opzione.
  • Fai il mio: Dovrebbe essere possibile:

    1. Scrivi il mio autoloader.
    2. Copia la classe originale in una cartella separata ( {root_dir}/var/tmp), avvolgila namespace \Magento { < original contents > }.
    3. Includi quel file.
    4. Includi la mia classe modificata OriginalClass extends Magento\OriginalClass {}

L'aspetto negativo di questo è ovvio: generazione di codice dinamico, regex, un po 'di sovraccarico per il caricamento di classi riscritte. Ma sono quasi sicuro che a questo punto batterebbe copiando ~ 5000 righe di codice quando voglio solo toccare / aggiungere ~ 100 righe.

So che sto chiedendo molto, ma c'è qualcosa di moderno e relativamente pulito là fuori che aiuta a risolvere questo problema?


1
Hai già trovato la soluzione di osservatore di Alans? stackoverflow.com/a/4636662/158325
B00MER

Risposte:



2

Segui il percorso AOP e utilizza una libreria basata su PHP come Go! AOP: L'ultima volta che ho controllato questo richiederà che le classi Magento vengano caricate dal caricatore automatico del compositore, non solo una disponibile. Flyingmana ha svolto alcuni lavori in questo settore, ma sicuramente non è pronto per l'uso in produzione e le mie esigenze sono più immediate. Voglio anche spedire come estensione e ciò richiederebbe una maggiore configurazione del compositore.

Voglio aggiungere quel Go! Il framework AOP può funzionare senza compositore, posso aiutarti con la configurazione (basta creare un problema su github per quello). Il compositore è necessario solo per un'integrazione trasparente con le applicazioni moderne.

Basta sostituire un include $filenameo require $filenamenel bootstrap con include FilterInjectorTransformer::rewrite($filename)e configurare un caricatore automatico per Go! AOP stesso.


1
Wow carino. Lo proverò sicuramente.
Daniel Sloof,

0

Vai con l'approccio del caricatore automatico. Rinomina / all / classi in lib con un prefisso:

find lib -name '*.php' -exec sed -e 's,^class ,class Oldlib_,' {} +

Esegui il seguente "override fixer" ogni volta che aggiungi un file a mylib:

find lib -name '*.php' -print | while read FILE
do
    classname=$(echo ${FILE}|sed -e 's,^lib/,,' -e 's,\.php$,,' -e 's,/,_,g')
    if [ ! -f mylib/${FILE#lib/} ]; then
        # ensure is_a works by providing a stub with correct classname
        echo "class ${classname} extends Oldlib_${classname} {}" > mylib/${classname}.php
    elif [ -f mylib/${classname}.php ]; then
        # we have a new override, but the old file still exists
        rm mylib/${classname}.php
    fi
done

Insegna al caricatore automatico a restituire mylib/${classname}.phpse esiste e mylib/full/path/to/class.phpse non lo fa e lo mylib/full/path/to/class.phpfa.

Inserisci le tue sostituzioni mylib/full/path/to/class.phped estendi la versione di Oldlib_.

Gli aggiornamenti semplicemente eseguono il rollback del prefisso in lib / aggiornalo, riapplicano il prefisso, rieseguono il fixer di sostituzione. Ciò che rimane è roba che è stata spostata lib/ed è stata precedentemente ignorata, ma non è correlata al problema. Il tuo problema potrebbe essere il numero di file della directory mylib /, ma confido che tu possa risolverlo :).


Questo approccio introduce molti rischi e cose da mantenere soprattutto per quanto riguarda gli aggiornamenti. Inoltre infrange la regola "non toccare il nucleo". Inoltre, non è un'opzione praticabile per gli sviluppatori di estensioni.
beeplogic,

Con tutto il rispetto ~ anche se la tua soluzione funziona ... non può essere considerato un a modernmodo per riscrivere i file lib. La programmazione imperativa è vecchia scuola;)
Eddie B,

0

Inoltre puoi definire lo Stream personalizzato e aggiungerlo all'inizio del percorso di caricamento automatico. Funziona con qualsiasi caricatore automatico e l'adozione minima richiede. Vedi esempio

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.