El problema es bien conocido: las lib
clases se cargan exclusivamente a través del autocargador, y no podemos cambiarlas más que:
- Copiándolos por completo a un codePool que se verifica antes que lib.
- Instalando el cargador automático PSR-0 , especificando un mapa de clase de carga automática, y luego copiando el archivo completamente en esa estructura de carpetas. [mi solución actual]
Estoy en una situación difícil porque quiero tocar potencialmente muchos de estos archivos, pero por el bien de mi cordura y estabilidad / capacidad de actualización de la tienda no quiero copiar clases de biblioteca completas.
Ahora, obviamente, hay posibles soluciones a este problema, pero todas vienen con su propio conjunto de problemas:
- Siga la ruta AOP y use una biblioteca basada en PHP como Go! AOP : la última vez que verifiqué esto requerirá que las clases de Magento sean cargadas por el autocargador del compositor, no solo una disponible. Flyingmana ha realizado un trabajo en esta área, pero definitivamente no está listo para el uso de producción y mis necesidades son más inmediatas. También quiero enviar como una extensión, y eso requeriría más configuración del compositor.
- Vaya a la ruta AOP y use una extensión PHP nativa : probablemente la más favorable en este punto, pero requeriría instalar una extensión separada, sin mencionar que no funcionaría con HHVM.
- Uso de PHP classkit y / o runkit : Es otra extensión nativa de PHP por lo que tiene el mismo problema que el anterior.
- Revise los sitios de llamadas para usar mi propia
\Danslo\Varien_X
versión del espacio de nombres ( ), luego extienda desde el original (\Varien_X
): hay demasiados sitios de llamadas para parchar y requeriría una cantidad tonta de reescrituras. No es una opción. Roll my own: Debería ser posible:
- Escribe mi propio cargador automático.
- Copie la clase original en una carpeta separada (
{root_dir}/var/tmp
), envuélvalanamespace \Magento { < original contents > }
. - Incluye ese archivo.
- Incluir mi clase modificada
OriginalClass extends Magento\OriginalClass {}
La desventaja de esto es obvia: generación dinámica de código, expresiones regulares, un poco de sobrecarga para cargar clases reescritas. Pero estoy casi seguro de que en este punto sería mejor copiar ~ 5000 líneas de código cuando solo quiero tocar / agregar ~ 100 líneas.
Sé que estoy preguntando mucho, pero ¿hay algo moderno y relativamente limpio que ayude a resolver este problema?
Respuestas:
Decidió implementar Go! Marco de AOP en Magento.
Ver Danslo_Aop en github.
fuente
Quiero agregar que Go! El marco de trabajo de AOP puede funcionar sin compositor, puedo ayudar con la configuración (solo crea un problema en github para eso). Composer solo se necesita para una integración transparente con aplicaciones modernas.
Simplemente reemplace uno
include $filename
orequire $filename
en su programa de arranque coninclude FilterInjectorTransformer::rewrite($filename)
y configure un cargador automático para Go! AOP en sí.fuente
Ir con el enfoque de autocargador. Cambie el nombre de / all / classes en lib con un prefijo:
Ejecute el siguiente "arreglador de anulación" cada vez que agregue un archivo a mylib:
Enseñe al autocargador a regresar
mylib/${classname}.php
si existe ymylib/full/path/to/class.php
si no existe y si existemylib/full/path/to/class.php
.Ponga sus anulaciones
mylib/full/path/to/class.php
y extienda la versión Oldlib_.Las actualizaciones simplemente retrotraen el prefijo en lib / actualícelo, vuelva a aplicar el prefijo y vuelva a ejecutar el fijador de anulación. Lo que queda son cosas que se trasladaron
lib/
y fueron anuladas anteriormente, pero eso no está relacionado con el problema. Su problema puede ser la cantidad de archivos del directorio mylib /, pero confío en que pueda resolver eso :).fuente
a modern
forma de reescribir archivos lib. La programación imperativa es de la vieja escuela;)También puede definir Stream personalizado y agregarlo en la parte superior de la ruta de carga automática. Funciona con cualquier cargador automático y requiere una adopción mínima. Ver ejemplo
fuente