D7 POO in D7 - pierregermain/MyDrupal GitHub Wiki
POO EN D7
- Encontramos algunas similitudes en D7 con la POO
- Vamos a ver cosas en D7 que se parecen a la POO
Historia
- Hasta D7 no se usó POO por razones de eficiencia.
- PHP es interpretado, por eso usar POO pierdes eficiencia.
- PHP adoptó tarde la POO, lo mismo ha pasado con Drupal.
- D7 necesita PHP 5, por ello hay módulos que usan POO pero la mayoría no lo hacen.
Conceptos de POO usados en Drupal
Objetos
En Drupal usamos el concecto de objectos para los siguientes componentes:
- Modules, Themes, Nodes y Users
Nodes:
- Sirve para crear contenido.
- Métodos definido en node.module
- Usan bundles para crear tipos de nodos, pero todos pueden usar los métodos definidos en
node.module
Modules y Themes:
- Siguen el Controller pattern en el sentido que usan sus propios funciones y definiendo Hooks.
Abstracción
La abstracción en D7 la conseguimos con el sistema de hooks. Los hooks se definen en el fichero *.api.php.
Para nodos es el fichero node.api.php
Encapsulación
La encapsulación se consigue usando namespaces de PHP. Cada módulo usa define funciones, pero para llamarlas hay que usar el namespace correspondiente.
El problema es que esto es una conveción y no es estricto.
Métodos Internos
Van precedidos por una barra baja.
Ejemplo:
Métodos públicos
NO van precedidos por barra baja, sino que van precedidos por el nombre del módulo
Polimorfismo
Los nodos usan polimorfismo al renderizarse. Cuando se va a renderizar un nodo, no se ve de la misma forma en un theme que en otro. Y no se ve de la misma forma un tipo de nodo que otro, todo eso gracias al polimorfismo
Herencia
En el caso de themes heredamos el base theme la manera en la que representamos los nodos. Si queremos cambiarlo podemos usar nuevos templates para romper esa herencia.
En el caso de modules todos heredean los hooks, y pueden implementar hooks para romper los métodos por defecto.
Patrones de Diseño en Drupal (Gang of Four)
Singleton / Instancia Única
Modules y Themes siguen este patrón. Sólo se instancian una vez.
Decorator / Decorador
Recordemos que El patrón Decorator responde a la necesidad de añadir dinámicamente funcionalidad a un Objeto. Esto nos permite no tener que crear sucesivas clases que hereden de la primera incorporando la nueva funcionalidad, sino otras que la implementan y se asocian a la primera.
Drupal usa mucho este patrón:
- Polimorfismo en el objeto node (visto antes)
- Sobre todo se ve en los hooks que permiten cambiar la funcionalidad existente. Ejemplos:
- El node por defecto tiene asociado ciertos datos (autor, título), y el hecho de poder añadir nuevos campos a nodos usa este patrón.
Observer / Observador
Este pattern se usa en los hooks. Cuando en tu módulo implementas un hook estás "observando" si se está ejecutando dicho evento.
Por ejemplo: hook_taxonomy_vocabulary_update()
Bridge / Puente
El database abstraction layer usa el Patrón puente ya que el mismo código core de drupal funciona con varios tipos de base de datos.
Chain of Responsibility / Cadena de Responsabilidad
En D7 el sistema de menús sigue toda una cadena de reponsabiliad
Cuando se hace un Request lo primero que se mira es si el link está dentro de la jerarquía de menús.
Si no se encuenta se mira si existe el padre (es decir si haces el request a /usuario/pepito pero pepito no existe entonces va a hacer el request contra /usuario). En este caso se llamará /usuario con variable de entrada pepito.
Además para cada Request se mira si el usuario que está accediendo a la URL tiene derecho a acceder a dicha URL.
Esto se realiza hacia "arriba" en la jerarquía hasta encontrar el GRANT o NO GRANT a dicho Request. En caso de tener el GRANT se ejecutan las funciones pertinentes.
Command / Orden
Recordemos que *Este patrón permite solicitar una operación a un objeto sin conocer realmente el contenido de esta operación, ni el receptor real de la misma. *
El sistema de hooks en sí usa este patrón, de modo que los módulos no tienen que definir cada hook, sino solo los que necesitan implementar.
Porque D7 no usa clases
- razones históricas
- prevenir complejidad en el sistema de theming
- facilidad para extender el sistema mediante hooks
A ser mejorado
- Módulos deberían encapsular mejor sus datos y definir si sus funciones son públicas o privadas
- Dificultad para hacer cambios drásticos en compartamientos del sistema si no tenemos un hook adecuado para ello.
Conclusión
-
Drupal 7 sigue sin ser POO por haber usado un lenguaje no orientado a objetos pero usa muchos conceptos internamente de la POO.
-
En Drupal 8 se hace un uso más intensivo de la Programación Orientada a Objetos que en versiones anteriores. Es por ello que debe conocerse a la perfección y controlarse de una forma fluida y natural.
-
En D8 hay que conocer los siguientes conceptos de la POO:
- Crear Clases y objetos
- Constructores y destructores
- Herencia de clases
- Clases abstractas
- Interfaces
- Traits
- Excepciones
-
En cuanto a los patrones usados en D8 son los siguientes:
- El patrón Factory method
- El patrón Singleton
- El patrón Adapter
- El patrón Decorator
- El patrón Strategy
- El patrón Observer
- El patrón Inyección de dependencias