The talking bit

A blog about programming, mainly PHP, and maybe other things


Project maintained by franiglesias Hosted on GitHub Pages — Theme by mattgraham

Historia de una reescritura (6) autoload sin namespaces

por Fran Iglesias

Como añadir autoload a un proyecto sin namespaces.

La serie Historia de una reescritura está compuesta de los siguientes artículos

Historia de una reescritura (1):
Historia de una reescritura (2): El problema con MVC
Historia de una reescritura (3): Empezar con la vista
Historia de una reescritura (4): El código tóxico
Historia de una reescritura (5): Tests
Historia de una reescritura (6): Autoload sin namespaces

CakePHP 1.3 tiene muchos problemas derivados de su antigüedad, como el hecho de no tener namespaces, carecer de un autoloader y otro muchos, como hacer un montón de llamadas estáticas a métodos que no lo son.

Aunque incluye una utilidad (App::import) para cargar las clases y un ClassRegistry, lo cierto es que si bien mejora un poco las cosas sobre un require o require_once a pelo, es bastante incómodo a la larga.

Una idea es aprovechar composer para tener un autoloader basado en un classmap, que no es más que un autoloader sencillo que registra todas las clases que desees y la ruta para incluirlas.

Aquí el ejemplo del que estoy usando:

En el caso de CakePHP hay que tener cuidado ya que el framework incluye unas cuantas clases fallback, con lo cual hay un buen número de ellas que se definen en varios archivos, uno de los cuales es tu versión y los otros son o bien plantillas o bien fallbacks, lo que provoca que Composer encuentre varios duplicados. Un ejemplo es AppController.

Como solución, Composer añade al mapa de las clases una de las clases que encuentra, por lo que bien podría pasar que seleccione justo alguna de las que no te interesa, lo que lleva a resultados más que inesperados.

La solución es tan sencilla como añadir a la clave ‘exclude-from-classmap’ las clases o rutas que necesites excluir.

A partir de ahí tendremos autoload para las clases en el espacio global. Si tenemos que compatibilizar con clases con namespace, no tenemos más que usar el FQCN global, o sea: \MiClase

March 20, 2017

Etiquetas: misc  

Temas

php good-practices blogtober19 testing refactoring tdd design-principles legacy misc design-patterns bdd tips python ddd tools soft-skills bbdd api sql ethics testing, swift javascript