You are on page 1of 17

Introduccion PCM y PCMB

PHP Component Model y PCM Basic


ste paper est orientado a la introduccin a PHP Component Model, un modelo de trabajo basado en componentes, que tiene como objetivo mejorar la reusabilidad, extensibilidad y calidad de un cdigo en php.

[Seleccione la fecha]

Pgina 0

Introduccin PCM y PCMB 2013

Introduccion
PCM es la sigla de PHP Component Model, la idea de ste documento es redactar de la forma ms simple y concisa una introduccin a sta idea de componentes en php. PCMB es la denominacin de un cdigo bsico diseado para soportar PCM y demostrar su funcionamiento, podra para ilustracin del lector compararse con un Framework, pero no pretende serlo, ms bien pretende ser la representacin prctica de PCM. Es importante siendo el segundo prrafo de ste paper, que se explique al lector, que PCM en Ningn momento puede llegar a compararse con otros modelos de componentes como COM (Component Object Model de Microsoft), pero esto no se menciona a lo largo del paper porque se asume que el lector entiende las limitaciones de PHP y que en realidad ste modelo trata de mejorar la forma de trabajar en php para acercarse lo ms posible a un modelo de componentes real, no obstante no es posible llegar a un grado en el que pueda ser comparado con otros modelos de componentes. PHP no fue diseado para trabajar con componentes, el objetivo de ste modelo es y ser el de apoyar a aquellos programadores de php que quieran empezar a entender la forma de trabajo con componentes, conocer que existe y las ventajas de trabajar de sta forma, para que a la hora de cambiar de lenguaje no represente demasiada complejidad. Dicho esto, PCM se divide en dos grandes partes, los componentes (Components) y el cdigo que controla y valida dichos componentes (Component Library System). A su vez, los componentes se dividen en 4 partes, una de las cuales es opcional por lo que en realidad se divide en 3 partes importantes, tales partes son, Component Body, Component Interface, Component Library. Quiero aclarar que sta es una versin ms actualizada, y si ustedes leen las publicaciones de mi blog pueden encontrar algunos trminos denominados de diferente forma, pero hacen referencia a las mismas divisiones. A lo largo de ste paper explicaremos cada parte de PHP Component Model (de ahora en ms PCM), y cmo funciona PHP Component Model Basic Example (de ahora en ms PCMB) en referencia a PCM. Es de suma importancia aclararle al lector que PCM est en estado experimental cuando se escribi este documento, por lo que puede sufrir grandes cambios de estructura e ideales en cuanto PCM valla madurando. Lamentablemente para que el lector pueda tener una clara comprensin de ste documento, tiene que tener conocimientos del patrn MVC, de programacin orientada a objetos (P.O.O.) y debe tener dominio de conocimientos tales como Clases, Abstracciones, Herencia, Traits, Interface. En general estos ltimos trminos pueden ser encontrados con su explicacin en la pgina de la documentacin de PHP. (referencia a www.php.net)

Redactado por Alexander Eberle Renzulli para Underc0de.org Puede visitar mi blog en console-input-output.blogspot.com

Introduccin PCM y PCMB 2013


Antes de comenzar con los temas importantes, quiero redactar una breve explicacin de la razn de existir de ste modelo y ste paper. Yo soy Alexander Eberle Renzulli, estudio en una escuela tcnica de argentina, especficamente en Mar Del Plata, Buenos Aires, Argentina. Y la idea de realizar un modelo de componentes para php surgi luego de mi idea de implementar disear el property para php (que lo pueden encontrar en el foro underc0de.org, tambin lo pueden encontrar en infiernohacker.com y portalhacker.net), cuando yo dise el property supongo que ya estaba empezando a formularme un poco la idea de construir cdigo reusable, ya que dise el property con la nica idea de simplificar mis clases a quien la use, no especficamente para m, por lo que supongo que ya estaba pensando en ello, pero no lo recuerdo, si s que luego de disear el property, unas semanas despus se me ocurri empezar a desarrollar clases que fueran lo suficientemente independientes como para funcionar en cualquier cdigo de cualquier persona sin tener que recibir ningn tipo de modificacin en el cdigo, tambin les integr unas cutres interfaces, y pasada una semana se me ocurri la idea de establecer una forma explcita para crear dichas clases, que incluya reglas de lo que no se debe hacer y lo que se debe hacer para tener un orden general en todas las clases, que luego llam componentes, ya que pueden ser encastrados en un cdigo y desencastrados de la misma forma (o esa es la idea) sin realizar ningn tipo de cambio en los componentes. Quiz el lector se pregunte, Para qu me puede llegar a servir esto? Es bastante simple, cada componente acta como un cdigo separado que puede ser utilizado en otro cdigo, y si seguimos las reglas de ste modelo, ese cdigo no puede ser alterado, est encapsulado por lo que ni siquiera es necesario conocer su funcionamiento interno, y plantea una interfaz sencilla y documentada que establece las funciones y atributos de dicho componente, vase su representacin grfica como un integrado, donde las patas son las funciones y la interfaz es el datasheet o la hoja con las especificacin de que hace cada pata y que valores se esperan de entrada. Siguiendo esa idea de componentes como un integrado, piense que dicho integrado puede ser usado en mltiples circuitos electrnicos, de forma que, en cdigo los componentes pueden ser integrados en muchos cdigos sin tener que reescribir o redisear para cada cdigo las mismas funciones, y sin tener que hacerle ninguna alteracin al cdigo, en pocas palabras uno puede integrar pedazos de cdigo con muchas funciones, que sea seguro, robusto y estable, usarlos, sin pensar en nada ms que las instrucciones de uso que el componente tiene, sin tener que tocar ni una lnea de cdigo, usted tendra armada gran parte y ya estara funcionando. Entonces con solo pensar un poco, usted se dar cuenta que es muy til, el hecho de no tener que estar escribiendo una y otra vez el mismo cdigo para cada uno de los proyectos, piense el tiempo que ahorrar al escribir un cdigo una vez e implementarlo en el resto de sus cdigos futuros sin tener que tocar ni una lnea de cdigo. Y como dice el dicho, el tiempo vale oro. Por otra parte esa no es la nica ventaja, tenga en cuenta que este modelo exige que el componente pueda evolucionar por separado de cualquier cdigo que lo use, esto es un punto muy importante, note que usted podr mejorar, extender y arreglar cualquier componente

Redactado por Alexander Eberle Renzulli para Underc0de.org Puede visitar mi blog en console-input-output.blogspot.com

Introduccin PCM y PCMB 2013


defectuoso y luego actualizar todos sus cdigos que usen ese componente al mismo tiempo, de forma tal, que usted solo crea una actualizacin y todos sus cdigos que usen dicho componente podrn actualizarse sin generar absolutamente ningn inconveniente. Esto ltimo responde a la idea de separar especificacin de implementacin, y realmente es muy til. Pero si pensabas que esas grandes ventajas eran solo las nicas que tiene esta forma de programar, ests muy equivocado, dijimos que, te ahorras tiempo porque puedes volver a usar el mismo cdigo sin tener que tocarlo en varios muchos proyectos, adems, puedes actualizar todos los proyectos con solo modificar el componente sin afectar a cada proyecto en particular, pero te has puesto a pensar qu ocurrir cuando ya tengas muchos componentes, lo ms probable es que cuando tengas que crear un nuevo proyecto, tengas casi todo programado, ya que lo ms probable ser que tengas componentes para cada necesidad, pero por supuesto no cobrars menos el trabajo porque ya tengas hechos todos los mdulos, entonces cuanto ms tiempo programes de esta forma, cada vez menos costo tendrs al desarrollar un proyecto, y por ende ms ganancias. Y adems tiene otras ventajas que no me pondr a explicar porque me llevara demasiado tiempo. Quiz te hayas puesto a pensar, o deberas haberlo pensado, si esto es tan til, por qu no hay muchsima gente que lo use? Esto no es nada nuevo, desde Windows 98 se puede apreciar que muchos programas tienen este modelo (vase famosas DLLS, que si se fijan la descripcin de un archivo dll dice extensin de aplicacin), hace muchos aos que esto se est usando, pero el costo inicial de desarrollar de esta forma es muy alto, programar a mansalva como hace la mayora, una lnea tras otra, no requiere mucha complejidad, de hecho la mayora de los programadores que siguen esos ideales, programa y programa y programa, pero no se pone a pensar qu es lo que est haciendo, en cambio, programar componentes es ms complejo, hay que pensar bien cada componente para que pueda trabajar correctamente en cualquier situacin, no sea dependiente del sistema que lo usa, y pueda evolucionar fcilmente sin afectar el funcionamiento del sistema que use una versin anterior. Inicialmente programar de esta forma lleva mucho ms esfuerzo y tiempo que programar de la otra forma ms comn, y de sta forma cuesta trabajo disear componentes para todas las situaciones, a m me llev unos meses poder llegar a sta idea, quizs a alguien ms aceitado le cueste mucho menos trabajo, pero al no ser la costumbre el programar de sta forma, y menos en php, requiere de bastante tiempo para acostumbrarse, lograr una cantidad importante de componentes para que empiecen a verse los frutos, por lo que es una actividad ms bien a futuro. Supongo que tambin se preguntarn si no hay algo as y estoy reinventando la rueda, en realidad no puedo afirmarlo, pero no vi un modelo de componentes para php que realmente hiciera lo que dice, la mayora de ellos no logra que la gente pueda realizar componentes de prcticamente cualquier parte de su cdigo. Hasta aqu llegamos con la introduccin, trat de realizar cada prrafo de la forma ms concisa y pequea posible.

Redactado por Alexander Eberle Renzulli para Underc0de.org Puede visitar mi blog en console-input-output.blogspot.com

Introduccin PCM y PCMB 2013

Componentes
Como expliqu en la introduccin, PCM se divide en dos partes, el Componente y el Component Library System. En sta parte del paper explicar una introduccin de los componentes, luego en otra parte explicar el Component Library System. Los componentes se dividen en tres partes, Component Body, Component Interface y Component Library.

Caractersticas generales de componentes


Un componente debe tener ciertas caractersticas, en trminos generales son: Ejecucin Independiente Evolucin Independiente Funcionalidad Independiente Compatibilidad absoluta a lo largo de versiones Eficacia absoluta Mxima robustez posible

Si un componente no cumple con las caractersticas expresadas previamente, el componente en realidad no es estable, y puede generar un funcionamiento errtico, explicar a continuacin cada una de las caractersticas.

Ejecucin Independiente
El componente debe poder ser ejecutado de forma independiente, sin ningn tipo de implementacin, ms que una implementacin bsica que pruebe el componente y cada una de sus funciones. No obstante la implementacin debe nicamente hacer uso del componente, no puede tener nada ms que, la creacin de una instancia del componente, y una llamada por cada funcin. Si el componente no es capaz de ejecutarse y funcionar sin necesidad de lneas de cdigo extra (como la conexin a la base de datos, o inclusin de un archivo de configuracin, ni siquiera llamar a la funcin sesin_start(); u ob_start();) y solo teniendo en la implementacin funciones del propio componente, dicho componente no es vlido, y es dependiente del sistema que lo utiliza.

Evolucin Independiente
Un componente debe poder ser mejorado por si solo, extendido y ampliado por si solo, sin necesidad de conocer el sistema para el cual se ampla, ni tenerlo, debe poder ser mejorado y extendido nicamente teniendo el cdigo del componente. Si dicho componente no puede ser mejorado, modificado, etc. Sin la necesidad de tener el cdigo del sistema que lo utiliza, el componente est atado a la evolucin del sistema, y es invlido.

Redactado por Alexander Eberle Renzulli para Underc0de.org Puede visitar mi blog en console-input-output.blogspot.com

Introduccin PCM y PCMB 2013


Funcionalidad Independiente
El componente debe contener funciones que respondan a la especificacin del propio componente, esto quiere decir, que no debe tener cdigo que no corresponda a su objetivo, por ejemplo, no debe tener conexiones a la base de datos, ya que genera una dependencia importante, primero hacia el controlador de base de datos que se est utilizando en el componente (por ejemplo PDO) lo cual evita al que implemente dicho componente tener la libertad de elegir su propio controlador de base de datos. Y por otra parte genera una dependencia hacia la configuracin y base de datos en s que est utilizando. No debe depender de funciones externas al componente, nicamente funciones de PHP que no generen dependencias hacia miembros externos.

Compatibilidad absoluta a lo largo de versiones


Un componente debe dar soporte para versiones anteriores cuando haya evolucionado, de modo tal, que si se borra una funcin, se notifique al Component Library System de la eliminacin de dicha funcin, si se cambia el nombre a una funcin debe ser notificado como alias de funcin x, Si una versin nueva del componente no tiene declaradas (mas no es necesario definirlas), dicho componente puede generar errores con cdigos viejos que utilicen el componente y lo hayan actualizado, generando as un conflicto. De modo que el componente que no cumpla esta condicin la nueva versin es invlida y desaconcejada, lo ms probable es que el Component Library System, note la falta de una funcin y desactive el componente guardando la notificacin en el log de errores del Component Library System, y dando de baja dicho componente del registro de componentes.

Eficacia absoluta
El componente no debe tener funciones en estado deprecated o experimental, tales funciones pueden tener un comportamiento errtico, y generar un conflicto en el componente, si un componente no cumple esta condicin est ABSOLUTAMENTE DESACONCEJADO! Ya que puede comprometer la integridad del sistema que lo utilice. Desarrollar componentes de esta forma describe al autor del componente como incompetente. Cuando php.net lanza una nueva versin, se debe revisar los componentes creados y actualizar las funciones que hayan sido quitadas. Lo que ocurre es que un componente debe ser eficaz, y si se implementan funciones inestables o desaconsejadas, pueden hacer al componente ineficaz.

Mxima robustez posible


Si bien php presenta limitaciones a la hora de hacer cdigo, es necesario, que cada programador que desarrolle un componente, lo haga teniendo en cuenta que quien use dicho componente puede ser un ignorante, (que muchos hay en el mundo) y enviar cualquier dato, o usar los componentes de forma errtica, por ejemplo si hay que utilizar ciertas funciones primero y otras funciones despus, hay que prever que el usuario no llame a las funciones en el orden correcto, o que si una funcin utiliza un dato de tipo numrico, el usuario mande un dato de tipo string, por lo que es necesario que se utilicen tcnicas como el casteo para asegurarnos de que los datos sean correctos.

Redactado por Alexander Eberle Renzulli para Underc0de.org Puede visitar mi blog en console-input-output.blogspot.com

Introduccin PCM y PCMB 2013


Eso entre otras cosas, no puedo escribir todos los posibles usos errneos porque me llevaran muchas hojas, por lo que dejo a criterio de cada desarrollador tener en cuenta ste punto y tomar las medidas necesarias. Si un componente no puede asegurar robustez, el mismo puede tornarse inestable en situaciones inesperadas y comprometer a todo el sistema. Es necesario que el mtodo constructor de la clase principal del componente no tenga parmetros obligatorios, por el simple hecho de no generar una dependencia externa.

Component Body
Teniendo en cuenta que ya expliqu las caractersticas generales que debe cumplir un componente para ser vlido, ahora explicar la primera parte de un componente, que es denominada Component Body o cuerpo del componente, sta parte es en general la parte ms importante, debe contener una clase (ya que los componentes deben estar escritos bajo el paradigma de programacin orientada a objetos) que represente al componente, y que incluya las funciones pblicas, privadas, los atributos, getters y setters que proveer el componente. Todas las partes de los componentes deben estar dentro de una carpeta con el nombre del componente. Es necesario que el archivo que contenga el Component Body, se llame con el prefijo Component por ejemplo, para un componente de correccin ortogrfica, le llamaremos ComponentCorrector.php y que la clase principal que represente al componente se llame de igual forma, por ejemplo: Class ComponentCorrector Hay una cuarta parte en los componentes, que se llama extensin, si necesitas tener ms de una clase puedes crear archivos de extensin con el prefijo Extension por ejemplo ExtensionGamatical.php en el ejemplo podra ser una clase para el corrector gramatical. Ahora bien, volviendo al tema del Component Body, la clase debe cumplir con las caractersticas que haba explicado antes, y debe adems hacer uso del trait ComLib (Component Library). Hay algo que necesito aclarar, vi en varias ocasiones, y hasta yo al principio lo haca as, que la gente programa las clases pensando en por ejemplo listar todos los registros de la tabla usuarios, por lo que crean una clase usuarios y crean funciones tales como, obtener usuarios, editar usuario, etc. En donde utilizan la clase como un medio para acceder a los registros de una tabla, es un error fatal, en realidad una clase representa a un objeto, el objeto tiene atributos, y funciones, la clase lo que hace es definir las caractersticas de dicho objeto, sin darle valores particulares, de modo que luego, al instanciar dicha clase, se creen los valores particulares de un objeto, usar la clase para manipular varias cosas a la vez, es un error, la clase debe estar diseada para luego instanciarse y crear un objeto, no un objeto que represente a muchos. Por lo que es imperativo que utilicen las clases con el fin para las que fueron creadas, y cuando diseen un componente creen las clases pensando en que representan a varios objetos, pero que en realidad cuando se instancie, lo que se cree ser un

Redactado por Alexander Eberle Renzulli para Underc0de.org Puede visitar mi blog en console-input-output.blogspot.com

Introduccin PCM y PCMB 2013


objeto por instancia, y no 300 registros por instancia. (Adems de que obviamente en este modelo no se puede utilizar base de datos dentro de un componente salvo de que el componente sea especficamente para manipulacin de base de datos, pero era para dar un ejemplo). A la hora de crear el componente, se crea la parte Component Body, y se incluye el Component Library, que dependiendo del framework o cdigo base que utilicen puede estar cargado ya, por lo que es necesario comprobar que haya sido cargado para no cargarlo ms de una vez (verificando la existencia de la constante COM_LIB_LOAD). Luego hay que tener en cuenta que hay que incluir las extensiones que utilice dicho componente, lo nico que no debe incluirse es la interface, el Component Library System, carga el Component Interface, el Component Body y dependiendo del desarrollador del Component Library System, tambin carga el Component Library, pero en ningn caso carga las extensiones. Si se desea borrar una funcin de un componente, es necesario dejar la declaracin de la funcin, pero en su definicin es necesario dejar simplemente un ; para que quede explcita la eliminacin de dicha funcin. Y en el constructor del componente llamar al notificador de eliminacin del Component Library (una funcin diseada para avisar al Component Library System que la funcin fue eliminada), si dicha funcin no est declarada, el Component Library System registrar la nueva versin y notar la falta de dicha funcin y no cargar el componente por incompatibilidad, luego tirar un Fatal Error notificando que el componente x es incompatible, que por favor vuelva a la versin x del componente o hable con el desarrollador. Si se desea cambiar el nombre a una funcin, debe dejarse la funcin vieja como alias de la primera llamando a la funcin del Component Library notificador de alias quien simplemente registrar el alias y llamar a la funcin nueva. Aunque tambin es vlido directamente llamar a la nueva funcin. Quiero aclarar, que los notificadores son funciones del Component Library, que son accesibles una vez que se especifica que la clase usa el trait Component Library. Si se desea modificar una funcin, agregando parmetros, es necesario que sean opcionales, pero nicamente si solo se desean agregar nuevos parmetros. Por el contrario si se desea modificar los parmetros cambindolos de lugar o quitando alguno, es necesario hacer un bridge (puente), para evitar que los sistemas viejos sigan llamando errticamente a las funciones con parmetros viejos. El puente consiste en llamar desde la funcin vieja a la funcin nueva con nuevos parmetros, ordenando los parmetros viejos como deberan estar en la funcin nueva. Tambin es necesario que si un cambio de este tipo ocurre se les notifique a los usuarios del complemento para que tomen las medidas necesarias para que su antiguo sistema acepte o pueda utilizar las nuevas caractersticas, de lo contrario utilizar nicamente caractersticas anteriores.

Redactado por Alexander Eberle Renzulli para Underc0de.org Puede visitar mi blog en console-input-output.blogspot.com

Introduccin PCM y PCMB 2013


Si se aplican las medidas previamente explicadas, se puede cumplir con la caracterstica de compatibilidad absoluta a lo largo de versiones. Es necesario tambin que cada funcin contenga en las primeras lneas un control de tipo de dato, y fuerce cada tipo al que se espera recibir (incluido string) por ejemplo $numero1 = (int) $numero1; Adems que si una funcin requiere por obligacin la previa llamada de otra, se realice la llamada dentro de la funcin, o se compruebe si ya fue llamada, stas dos medidas colaboran con la caracterstica de mxima robustez posible, no obstante no es lo nico que se debe implementar, por lo que dejo a decisin del desarrollador que tome las medidas que crea pertinentes. Adems los componentes deben responder a Encapsulacin y Ocultamiento de informacin. El component body NO debe tener comentarios que expliquen lo que cada funcin hace, lo que una lnea hace, o lo que en general hace la clase, es mejor si no tiene directamente ningn tipo de comentario, las razones sern explicadas en el apartado de Component Interface. Y por ltimo y no menos importante el Component Body debe cumplir los requisitos del Component Library, dichos requisitos sern explicados en la parte del paper que hable especficamente de Component Library.

Component Interface
Una de las cosas que son necesarias para que el modelo de componentes funcione correctamente es necesario que un componente tenga comentarios adecuados, pero esto no significa que se llene el cdigo con una explicacin lnea por lnea de lo que se hace, no solo no es necesario, sino que adems no tiene sentido alguno, la idea de los componentes es que sean fciles de usar, simplemente se carguen, y se consulte la interface para obtener un resumen de las funcionalidades y el detalle sobre lo que cada parmetro exige, adems del tipo de dato esperado. La interface cumple la funcin de datasheet de un componente de electrnica por ejemplo, que especifica que hace cada funcin, que entradas se esperan, y que salida se obtendr, por lo que es necesario que todas las funciones pblicas sean declaradas en esa seccin, y sean explicadas con comentarios. Pero que los usuarios sepan que funciones hay y qu hacen no significa que tenga que explicarles a los que usen sus componentes como el componente hace lo que hace, de hecho eso resulta negativo, si utiliza la creacin de componentes como actividad comercial. El archivo Component Interface debe tener de nombre el nombre del componente, pero de prefijo la palabra Interface, quedando por ejemplo InterfaceCorrector.php y dentro debe tener la estructura Interface de php (vase la documentacin de php con respecto al constructor Interface), que de nombre debe tener tambin el prefijo interface, por ejemplo:

Redactado por Alexander Eberle Renzulli para Underc0de.org Puede visitar mi blog en console-input-output.blogspot.com

Introduccin PCM y PCMB 2013


interface InterfaceCorrector { } La clase del Component Body debe implementar dicha interface, no obstante, las extensiones deben tener las interfaces dentro de cada extensin. El nico momento donde se permite omitir la implementacin de una interface aunque debe estar hecha, es cuando el Component Body est compuesto por una clase abstracta, aunque est desaconcejado el uso de clases abstractas en el component body, se puede hacer, y en las extensiones se puede hacer con tranquilidad. La interface debe tener primero las funciones getters y setters para que el usuario pueda conocer los atributos, y debe comentarse si son accesibles o no. Si se usa el Trait Property debe explicarse en comentarios que se hace uso del Trait Property y no es necesario utilizar las funciones getters y setters, que se puede utilizar el atributo directamente. Luego deben estar las funciones pblicas (incluido el constructor) especificando con comentarios, que hace la funcin, que datos y tipos se espera en cada parmetro, y que dato y tipo se retornar de la funcin. Antes de la declaracin de la interface se debe escribir un comentario explicando cual es el objetivo del componente. RECUERDE: en la interface es el nico lugar del componente donde deberan haber comentarios, ya que la idea es que la persona que use el componente no tenga que abrir nada ms que la interface para conocer su funcionamiento.

Component Library
Es la seccin del componente encargada de comunicarse con el mecanismo de control de componentes (Component Library System) para asegurar la validez y evitar comprometer a un sistema, si el componente es alterado, incompatible, o puede llegar a generar errores. El ComLib debe ser un trait, que se encuentre en el archivo ComLib.php dentro de la carpeta del componente, para asegurar su portabilidad e independencia del sistema que lo utilice. Adems si bien en PCM se permite la creacin de componentes formados de clases de tipo abstracta (segn la definicin de clases abstractas de php), PCMB NO permite que la clase principal del componente sea abstracta (no obstante clases dentro de archivos de extensin si son permitidos). El trait ComLib debe contener un mecanismo para devolver informacin del componente, que normalmente se ubica en un archivo com.json dentro de la carpeta del componente, y que contiene un json con un arreglo asociativo con los siguientes valores:

Redactado por Alexander Eberle Renzulli para Underc0de.org Puede visitar mi blog en console-input-output.blogspot.com

Introduccin PCM y PCMB 2013


{ component_version : 1, component_autor:Alexander Eberle, component_contact:alexander171294@gmail, php_support_version:5.4, comlib_version:1, last_update:01/11/13 } Explicando un poco lo que es cada cosa: Component_version es la versin del componente, cuando se realiza un cambio se debe aumentar la versin en +1 Component_autor: es el nombre del autor del componente, si un componente es implementado y luego en alguna actualizacin, dicho nombre cambia, el Component Library System generar un warning error advirtiendo que el autor fue alterado php_support_version: versin de php en la que fue escrito el componente comlib_version: versin de component library para la que fue escrito el componente last_update: ltima actualizacin del componente El trait ComponentLibrary debe proveer una funcin que devuelva al ComponentLibrarySystem las funcionalidades que puede realizar dicho componente, para que el component library system pueda llevar un control de compatibilidad.

Component Library System


Los componentes deben ser controlados, deben ser validados, y se debe llevar un registro de los componentes que son vlidos, para que si cambian, se pueda verificar la compatibilidad. Component Library System es en trminos generales lo que podra ser considerado un Protocolo de validacin y carga de componentes, su objetivo es validar un componente para no comprometer el sistema, revisando que dicho componente cumpla con las expectativas, tenga una interfaz, y otras reglas de componentes previamente explicadas. Si un componente no es vlido, el mismo no ser cargado, evitando as comprometer todo el sistema. En CPMB el Component Library System est conformado por una clase esttica. En primer lugar el Component Library System debe llevar un registro de los componentes existentes, en PCMB, el Component Library System guarda el registro en el archivo Components.ini, lo carga una vez inicializado el cdigo, y lo guarda una vez terminada la ejecucin del cdigo, mientras tanto este registro de componentes es cargado en memoria para un manejo rpido y flexible.

10

Redactado por Alexander Eberle Renzulli para Underc0de.org Puede visitar mi blog en console-input-output.blogspot.com

Introduccin PCM y PCMB 2013


Si un componente no est registrado por el ComponentLibrarySystem debe ser registrado cuando es solicitado por primera vez, controlando la existencia de los archivos que lo conforman (tales como el Component Body, Component Interface y Component Library), controlando tambin que el componente implemente la interface y el component library (no solo que lo tenga entre los archivos del componente). Para poder registrar el componente, el CLS (component library system) debe llamar a la funcin del ComLib y obtener informacin sobre el componente, para luego comparar si la versin del comlib para la que fue creado el componente es la misma que est usando el sistema. Luego debe registrar tanto la informacin como la lista de funciones que actualmente puede realizar el componente. Si el componente ya est registrado, debe obviarse el paso anterior, y comenzar con las validaciones, donde se valida obligatoriamente: Que los archivos estn La versin del component lib sea vlida Si el que utiliza dicho componente especific que la versin tiene que ser una en especfico (la versin del componente), se tiene que validar que dicha versin sea correcta. Se tiene que validar que datos relevantes como el autor no hayan sido alterados. Se tiene que validar que las funciones que tena anterior mente sigan estando disponibles para conservar la compatibilidad (para esto debe hacerse la llamada al comlib del componente que obtiene la lista de funciones del mismo).

Si el componente hasta este punto es vlido, se libera el CLS dejando disponible dicho componente para su uso. En caso de que un componente no tenga una funcin, pero el que hace uso del componente y desarroll el sistema, ya prepar el sistema para que soporte las nuevas caractersticas y deje de usar caractersticas viejas, lo nico que debe hacer es vaciar el components.ini obligando as a que el CLS vuelva a registrar todos los componentes que hayan sido actualizados. ESTO SOLO DEBE HACERSE SI SE AJUST EL CDIGO PARA QUE FUNCIONE SIN LAS FUNCIONES QUE FUERON QUITADAS.

Uso correcto de componentes


Quizs a usted no le interese en realidad conocer en detalle, o de forma introductoria el funcionamiento de PCM y solo desea crear un componente, por lo tanto, dedicar ste apartado a detallar la creacin de un componente vlido. En primer lugar tiene que entender que hay ciertas reglas que ustede debe conocer y se detallan en la parte de Componentes de ste pdf, en especial la introduccin a componentes y la seccin Component Body.

11

Redactado por Alexander Eberle Renzulli para Underc0de.org Puede visitar mi blog en console-input-output.blogspot.com

Introduccin PCM y PCMB 2013


Podemos definir a un componente como un bloque de cdigo, que tiene caractersticas tales como, individualidad (con esto me refiero a que, el componente puede ser tanto ejecutado, como desarrollado, actualizado y evolucionado, de forma individual, sin el requerimiento de cualquier cdigo que lo implemente), esto es parte de la idea de Separar la implementacin de la especificacin, es de carcter crucial, que se desarrolle y prueba el componente fuera de cualquier sistema antes de implementarlo en uno, para asegurar su funcionamiento individual. Los componentes estn divididos en partes que ya expliqu, y deben tener un cuerpo principal, o una clase que represente al componente en s, el componente tambin debe tener una interface y un archivo de informacin, (adems de una librera que por ejemplo PCMBasic ya incluye). Lo primero que vamos a hacer a la hora de crear un componente es pensar un nombre sin espacios y sin caracteres especiales, solo letras y nmeros, empezando con una letra. Por ejemplo MensajesPrivados, a partir de ahora tomaremos este como el ejemplo para crear un componente. Yo como soy el creador de PCMB obviamente que lo voy a usar, por lo que voy a copiar y pegar renombrando la carpeta example, dentro de models/components (ubicacin por defecto de los componentes en PCMB) para ya tener todos los archivos de ejemplo, y no tener que estar crendolo uno por uno. Primeramente voy a editar (o crear) el archivo com.js que contiene la informacin de mi componente, cada vez que quiera hacer una edicin al mismo debo actualizar este archivo. Voy a citar un captulo anterior donde explicaba ste archivo: { component_version : 1, component_autor:Alexander Eberle, component_contact:alexander171294@gmail, php_support_version:5.4, comlib_version:1, last_update:01/11/13 } Explicando un poco lo que es cada cosa: Component_version es la versin del componente, cuando se realiza un cambio se debe aumentar la versin en +1 Component_autor: es el nombre del autor del componente, si un componente es implementado y luego en alguna actualizacin, dicho nombre cambia, el Component Library System generar un warning error advirtiendo que el autor fue alterado php_support_version: versin de php en la que fue escrito el componente comlib_version: versin de component library para la que fue escrito el componente last_update: ltima actualizacin del componente

12

Redactado por Alexander Eberle Renzulli para Underc0de.org Puede visitar mi blog en console-input-output.blogspot.com

Introduccin PCM y PCMB 2013


Una vez que tenemos el archivo de informacin de nuestro componente pasamos a crear nuestra clase principal del componente, para lo cual creamos o editamos si ya lo tenemos el archivo ComponentExample.php (ahora ser llamado ComponentMensajesPrivados.php) Primero que nada se incluye si no se realiz hasta el momento, el comlib, para lo cual verificamos la existencia de la constante COM_LIB_LOAD. Luego pasamos a requerir cualquier extra que necesitemos (recurdese que los extras nicamente pueden ser partes del componente, que deceamos tener en archivos externos, ya sean clases abstractas, o lo que fuere). Y ahora si construimos nuestra clase, que har uso del trait comlib. Recuerde que la clase debe llamarse ComponentNOMBRECOMPONENTE, en nuestro ejemplo ComponentMensajesPrivados.php. Recuerde tambin que si se requiere hacer uso del mtodo constructor sus parmetros deben ser opcionales. Recuerde tambin que no se debe hacer uso directo de bases de datos en componentes salvo que dicho componente sea una simplificacin de un controlador de bases de datos, por ejemplo si usted quiere simplificar el uso de pdo y crear un componente que se llame PDOSIMPLE donde haga las conexiones y simplifique la sintaxis de pdo o la quiera hacer a su gusto, en ese caso es vlido, pero no si usted quiere obtener un registro de un mensaje privado por ejemplo. Por otro lado recuerde que en un componente no debe tener dependencias hacia otros componentes o cualquier cosa externa a dicho componente. Por ejemplo no debe tener funciones tales como echo ya que debe permitrsele al usuario que utilice el componente, poder especificar la forma en que mostrar los datos. Una vez que tengas armado el componente que haga todo lo que desees, debes crear la interface para nuestro ejemplo sera el archivo InterfaceMensajesPrivados.php que documente cada funcin, sus parmetros, los tipos, lo que retorna, solo para funciones pblicas. Puede revisar la seccin de este pdf que habla sobre ComponentInterface para una mejor referencia. Cuando ya en tu carpeta tienes el ComponentMensajesPrivados.php, el InterfaceMensajesPrivados.php, el ComLib.php, y el com.json (tambin puedes tener ExtensionAutor.php, ExtensionBusqueda.php, etc.) tu componente ya est listo (Recuerda que debe cumplir con todas las exigencias que se describen a lo largo de ste documento).-

13

Redactado por Alexander Eberle Renzulli para Underc0de.org Puede visitar mi blog en console-input-output.blogspot.com

Introduccin PCM y PCMB 2013

PCMB Introduccion
PCMB es un mini cdigo diseado para trabajar como la base minina e indispensable para comprobar el funcionamiento de PHP Component Model, este cdigo adems lo utilizo para mis proyectos personales (con previas modificaciones a mi gusto), no presenta un cdigo muy complejo, ms bien simple, que est basado en el patrn de diseo de cdigo de PHP MVC, donde se separa el cdigo en Modelo Vista Controlador, la vista es la parte del cdigo que tiene el diseo, los modelos son una abstraccin de la base de datos, y los controladores son el nexo entre los modelos y las vistas, pero a esto se le agreg un poco de complejidad en la seccin de modelos, donde se agreg el modelo de componentes, permitiendo cargar componentes en los modelos. PCMBasic no pretende ser un cdigo para uso diario, ms bien un simple demostrativo para la implementacin de componentes, si uno tiene en cuenta esto, hay que agregar cosas como un gestor de plantillas para limpiar los diseos web, yo en lo personal constru un componente en base a RainTPL (el gestor de plantillas).Por otra parte un gestor de base de datos (dise un componente propio que acta como gestor de base de datos). Entre otras cosas, ambos componentes los agregar en PCMBasic, para simple demostracin, pero no estn incluidos en documentacin ni se da soporte para estas partes del sistema. Adems tambin se incluy un archivo .htaccess para simplificar el manejo de urls, (comentar un poco ms de su estructura en la seccin de este pdf que habla sobre PCMB Otros detalles) Para finalizar, quiero solicitarle al lector que utilice el cdigo para la funcin que fue desarrollado y no para otras cosas, ya que a diario veo a usuarios, utilizar cdigos para cosas para las que no fueron diseados, y cuando no funcionan correctamente le echan la culpa del mal funcionamiento al autor del cdigo.

PCMB Controladores
En esta seccin del pdf tratar de explicar de la forma ms sencilla el funcionamiento de los controladores y la forma en la que fueron diseados Para empezar les comentar que los controladores estn conformados por clases, que son instanciadas y llamadas las funciones de forma automtica basada en la configuracin de links, que se encuentran en el archivo permitidos.json, donde se crea un arreglo de controladores y sus funciones internas que son permitidas, notese que el archivo est escrito bajo la normativa de JSON, puede buscar en google la documentacin respectiva. Las acciones son el primer texto que luego se le asigna un arreglo compuesto por la funcin que est permitida.

14

Redactado por Alexander Eberle Renzulli para Underc0de.org Puede visitar mi blog en console-input-output.blogspot.com

Introduccin PCM y PCMB 2013


Es necesario que los controladores extiendan la clase controller, y hagan uso del trait Singleton, como en el de ejemplo. Tambin es obligatorio que se escriba la funcin init(); que hace de constructor, se llama de la misma forma pero no admite parmetros, en el caso de que se le cambie la visibilidad (de public a private por ejemplo) o se la declare de diferente forma, se lograr un error, de la misma forma que si se agregan parmetros no opcionales. Lo mismo ocurre con el resto de las funciones, aunque si se admite la creacin de funciones privadas para uso interno, aunque las mismas no podrn ser accedidas por url, aunque se agreguen al archivo permitidos.json Por ltimo, si no se especifica que controlador cargar, se cargar el home, y si no se especifica una funcin se cargar la funcin main (que deben estar ambos en el archivo permitidos.json). En los controladores se puede escribir la funcin load_model(nombre); para cargar un modelo especfico y luego utilzarlo. Las clases de los controladores no deben ser abstractas y no deben tener funciones estticas.

PCMB Vistas
Las vistas pueden ser creadas y cargadas a gusto, PCMBasic no incluye ningn tipo de gestin para las mismas, no obstante a modo demostracin se agrega un componente basado en RainTPL (puede encontrar la documentacin o elegir no utilizarlo borrando la carpeta e incorporando otro).

PCMB Modelos
Los modelos tienen que ser creados como clases estticas, no hay razn alguna para crear un modelo e instanciarlo, (entindase que los objetos deben ser creados en base a los componentes, armados y devueltos para que los controladores hagan uso de los mismos), y deben proveer de gestin de base de datos. En realidad no hay ms restricciones para los modelos, pero los mismos fueron diseados para hacer de plataforma entre los componentes, por ejemplo si se quiere mostrar una lista de usuarios, donde hay un componente usuarios, y se tiene que instanciar la clase de dicho componente para cada uno de los usuarios, se llamara a la funcin del modelo que gestiona los usuarios para obtener un arreglo con todas las instancias de cada usuario (es a modo de ejemplo para que pueda entender la idea para la que fue diseado, y esa tambin es la razn por la que debera ser esttica, no es requerido instanciarla y no se debera hacer).

PCMB otros detalles


15
Redactado por Alexander Eberle Renzulli para Underc0de.org Puede visitar mi blog en console-input-output.blogspot.com

Introduccin PCM y PCMB 2013


Para finalizar quiero darle a entender al usuario detalles de PCMB que no tienen que ver con MVC ni con PCM, por un lado los links pueden ser creados de dos formas, en primera instancia, se pueden crear sin urls amigables: Index.php?action=nombrecontrolador&f=funcioncontrolador&id=numerootexto O de forma amigable: /nombrecontrolador/funcioncontrolador/id/ Siempre debe terminar en / y ninguna de las 3 partes del link son necesarias. Puede obtener cada una de ellas as: $_GET[action] $_GET[f] $_GET[id] Por otro lado PCMB incluye soporte para multiples idiomas de forma nativa, de hecho carga un archivo de idioma dependiendo del idioma del navegador, los lenguajes pueden ser definidos en el archivo langs.json PCMBasic carga el archivo idioma.php que debe encontrarse dentro de la carpeta langs/ y debe ser escrito como un arreglo y ser devuelto con un return, luego se encuentra en cada controlador en una variable interna $this->lang. En el archivo index.php puede configurarse las variables de los links que son utilizadas para cargar los controladores, por si usted desea crear otro formato de link, el display_errors, si se desea mostrar errores, el idioma por defecto, etc.

16

Redactado por Alexander Eberle Renzulli para Underc0de.org Puede visitar mi blog en console-input-output.blogspot.com