Revisión de My CakePHP 3: aún fresco, aún caliente

Publicado: 2022-03-11

El mes pasado, el equipo de CakePHP anunció el lanzamiento de la versión alfa de CakePHP 3. El equipo de desarrollo de Cake considera que la versión 3 cambiará las reglas del juego, por lo que con la versión alfa de la versión 3 recién salida del horno, este artículo toma una nueva mirada a CakePHP 3 como un marco moderno y eficaz para el desarrollo de PHP.

Esta golosina CakePHP 3 está recién salida del horno.

Una breve historia

En estos días, hay tantas opciones cuando se trata de desarrollo de PHP. A medida que PHP ha madurado, más y más PHP Frameworks han aparecido en escena, brindando a los desarrolladores una amplia gama de opciones. Pero no siempre ha sido así.

En 2005, cuando PHP 4 todavía era el estándar, no había marcos PHP y desarrollar un enfoque de codificación orientado a objetos en PHP fue sin duda un desafío. Fue entonces cuando surgió CakePHP, el primer framework PHP MVC. En los casi 10 años que han pasado desde que se lanzó por primera vez, CakePHP ha seguido evolucionando, manteniendo una saludable participación en el mercado de desarrolladores de PHP.

¿Qué tan popular es el marco CakePHP? Está clasificado entre los 4 proyectos PHP más populares en GitHub, de alrededor de 130 000 proyectos, con más de 18 000 miembros en el grupo CakePHP de Google con 32 000 temas. Con 270 contribuyentes al código y 320 contribuyentes a la documentación, no se puede negar que CakePHP tiene muchos seguidores. La creciente popularidad actual de CakePHP está bien resumida en un artículo de James Watts, miembro principal y administrador de la comunidad de CakePHP para la Cake Software Foundation, a quien entrevisté mientras escribía este artículo.

Con la versión 3 del marco ahora disponible, se espera que CakePHP siga siendo una fuerza líder en el mundo de PHP y un competidor importante en medio del variado panorama actual de marcos PHP.

¿Qué hay de nuevo en la versión 3 de CakePHP?

Esta revisión se basa en la versión alfa de CakePHP 3.0, que incorpora una serie de nuevas características y mejoras que incluyen:

  • Mejor presentación. La versión 3 incorpora mejoras de rendimiento en el proceso de arranque, el proceso de enrutamiento y varias partes del proceso para generar plantillas auxiliares.

  • Componentes y ayudantes mejorados. La versión 3 brinda soporte mejorado para "mensajes flash" con su nuevo FlashHelper y FlashComponent. Además, se ha mejorado CookieComponent, lo que facilita la separación de la configuración de los espacios de nombres de las cookies y el manejo de los datos de las cookies.

  • Gestión de sesiones mejorada. La gestión de sesiones siempre ha sido una clase estática en CakePHP que ha demostrado ser problemática de varias maneras. Con la versión 3, ahora puede acceder a la sesión desde el objeto de solicitud $this->request->session() . Este cambio también hace que la sesión sea más fácil de probar y permite que CakePHP use PHPUnit 4.x.

  • Mejora de la consistencia de las convenciones. El esqueleto de la aplicación y los esqueletos del complemento se han actualizado para usar la misma estructura de directorios a fin de ser más coherentes entre sí.

  • Temas y complementos fusionados. Un objetivo clave de CakePHP 3 era hacer que los temas fueran más potentes y robustos. Trabajando hacia ese objetivo, se hizo evidente que lo que realmente se necesitaba era que los temas proporcionaran las mismas capacidades que los complementos. En consecuencia, ahora se puede usar cualquier complemento como tema, lo que también simplifica el empaquetado y la redistribución.

  • Mejoras ORM. Se han realizado varios cambios de API en el ORM (mapeo relacional de objetos). En particular, ahora es más sencillo especificar asociaciones profundas para guardar operaciones, y se cambiaron un par de convenciones para reducir la curva de aprendizaje y la confusión entre los nuevos usuarios.

Además, hay algunas características adicionales que también se planean incorporar en la versión beta de la versión 3.0. Más importante:

  • Mejoras en funciones de internacionalización y localización (i18n y L10n)
  • Un reemplazo para CacheHelper basado en Edge Side Incluye
  • Una nueva API de enrutamiento para una declaración de ruta más simple y rápida

De hecho, la versión 3 representa una mejora significativa con respecto a las versiones anteriores de CakePHP.

¿Por qué CakePHP?

Si bien CakePHP tiene muchas características excelentes, esta revisión se enfoca en algunas en particular que realmente ayudan a diferenciarlo, a saber:

  • Convención sobre configuración
  • ORM de CakePHP (Mapeo relacional de objetos)
  • Componentes y ayudantes

Convención sobre configuración

CakePHP siempre ha tenido un desarrollo rápido y consistente y, con ese fin, CakePHP pone un gran énfasis en la convención. Por lo tanto, al igual que Ruby on Rails (del cual CakePHP se inspiró en gran medida), CakePHP se adhiere fuertemente a la convención sobre el principio de configuración.

Las convenciones significan que un desarrollador no tiene que pensar en "dónde van las cosas" cuando aprende a usar el marco CakePHP, ya que los valores predeterminados para estas reglas ya están establecidos. Si bien es necesario familiarizarse con las convenciones de CakePHP, una vez dominadas, el desarrollador puede concentrarse en el desarrollo central, en lugar de preocuparse por dónde se coloca el código y otros problemas de configuración.

Las convenciones de CakePHP contrastan marcadamente con el propio PHP, que es un lenguaje bastante liberal. Como resultado de sus convenciones, CakePHP ayuda a garantizar una mayor coherencia en el estilo y la estructura de la codificación entre varios desarrolladores e incluso entre varios equipos. Al adoptar un conjunto estándar de convenciones, Cake se esfuerza por hacer que el desarrollo sea más consistente.

Para un esquema de base de datos, por ejemplo, CakePHP hace ciertas suposiciones predeterminadas en términos de cómo se nombrarán ciertas variables, nombres de tablas y campos. Específicamente, Cake espera que:

  • Los nombres de las tablas estarán en plural (por ejemplo, orders )
  • El nombre del campo de clave principal será id
  • Los nombres de cualquier campo de clave externa se basarán en el nombre de la tabla a la que se hace referencia seguido de _id (por ejemplo, la clave externa en una tabla de customers se llamaría customer_id ).

Para ilustrar, consideremos una simple revisión de dos tablas ( articles y users ) de una base de datos de publicaciones de blog. En nuestro ejemplo, diremos que Articles "BelongsTo" Users y Users "HasMany" Articles . Estas relaciones se especificarían de la siguiente manera en CakePHP 3.0:

 In ArticlesTable.php: class ArticlesTable extends Table { public function initialize(array $config) { $this->belongsTo('Users'); } } In UsersTable.php: class UsersTable extends Table { public function initialize(array $config) { $this->hasMany('Articles'); } }

CakePHP asume las convenciones predeterminadas y, por lo tanto, sabe automáticamente qué claves externas buscar (es decir, user_id en la tabla de articles ) al buscar cualquier asociación.

Sin embargo, es importante enfatizar que CakePHP 3 permite anular fácilmente sus convenciones predeterminadas. Por ejemplo, supongamos que nuestra clave externa en la tabla de users se llama author_id en lugar de user_id . Especificar esto solo requeriría los siguientes dos pequeños cambios en nuestro código para que CakePHP sepa que no estamos usando el valor predeterminado:

 In ArticlesTable.php: class ArticlesTable extends Table { public function initialize(array $config) { $this->belongsTo('Users' => ['foreignKey' => 'author_id']); } } In UsersTable.php: class UsersTable extends Table { public function initialize(array $config) { $this->hasMany('Articles' => ['foreignKey' => 'author_id']); } }

Entonces, aunque las convenciones son parte integral de CakePHP y definitivamente tienen sus ventajas, anularlas cuando sea necesario es bastante simple, como hemos demostrado aquí.

Si bien algunos desarrolladores pueden preferir los marcos PHP (como Yii y Laravel) que no dependen tanto de las convenciones, las convenciones de CakePHP pueden ser bastante ventajosas. Pueden ayudar a reducir drásticamente el tiempo de aceleración para un desarrollador de CakePHP cuando se le asigna la tarea de mejorar o mantener el código escrito por otro desarrollador, ya que dan como resultado una estructura de codificación y convenciones consistentes en múltiples desarrolladores y proyectos de CakePHP.

Mapeo relacional de objetos (ORM) de CakePHP

El mapeo relacional de objetos (ORM) de CakePHP se beneficia enormemente de las convenciones del marco de trabajo de CakePHP. Al configurar el esquema de la base de datos según los estándares de Cake, puede conectar tablas rápidamente a través del poderoso ORM de Cake. Rara vez necesitará escribir una declaración SQL, ya que CakePHP maneja cosas como uniones de tablas, hasMany e incluso relaciones hasAndBelongsToMany con facilidad.

Aprovechando ContainableBehavior de CakePHP, a través de sus asociaciones de modelos puede especificar qué tablas y campos de base de datos seleccionar de una consulta SQL. Esto puede abarcar varias tablas y, a través del ORM, es fácil construir rápidamente sentencias SQL altamente complejas.

Por cierto, ContainableBehavior de CakePHP es un gran ejemplo de cómo CakePHP puede simplificar y agilizar el desarrollo de PHP. Lo ayuda a buscar y filtrar datos de una manera limpia y consistente y también puede ayudarlo a aumentar la velocidad y el rendimiento general de su aplicación. (Funciona alterando de forma temporal o permanente las asociaciones de sus modelos, utilizando los contenedores suministrados para generar una serie correspondiente de llamadas bindModel y unbindModel ).

El desafío con el ORM es que hace que el uso de SQL sea tan simple que, si un desarrollador no tiene cuidado, puede escribir consultas SQL ineficientes sin querer. Ciertamente he visto muchas veces aplicaciones de Cake mal escritas que no han optimizado sus consultas. Estos problemas tienden a surgir un par de años después de que se haya implementado un sistema, cuando las bases de datos aumentan de tamaño y las consultas mal escritas se vuelven cada vez más lentas.

El problema principal aquí es que, antes de la última versión 3 de CakePHP, el ORM de Cake recuperaría de forma predeterminada cualquier tabla asociada al realizar una consulta. Como resultado, una simple consulta de "buscar todo" podría volverse bastante inflada ya que el SQL subyacente recuperaría todos los datos de todas las tablas asociadas. En la versión 3, este comportamiento ya no es el predeterminado. (Y en versiones anteriores de CakePHP, este comportamiento predeterminado es fácil de desactivar simplemente agregando public $recursive = -1; a su archivo AppModel.php principal).

En general, una revisión del ORM de Cake muestra que realmente ayuda a agilizar el desarrollo y, si se usa correctamente, es una herramienta increíble para crear consultas complejas rápidamente. No obstante, es vital que los desarrolladores se tomen el tiempo para comprender completamente el ORM y asegurarse de que sus consultas estén correctamente optimizadas (como ocurre en cualquier idioma).

Componentes y Ayudantes: Bibliotecas CakePHP

Una de las mejores características de CakePHP son las bibliotecas integradas (Componentes y Ayudantes) que eliminan muchas tareas de desarrollo aburridas, repetitivas y tediosas. En el contexto de MVC, los componentes ayudan a agilizar el desarrollo del controlador, mientras que los ayudantes simplifican la codificación y la lógica de la vista (es decir, la capa de presentación).

El PaginatorComponent , por ejemplo, crea automáticamente una interfaz de página siguiente/anterior a partir de una consulta de búsqueda. Agregue JsHelper y, de repente, tendrá Paginación AJAX, impulsada por su marco JavaScript favorito (jQuery de forma predeterminada).

Una muestra rápida de otros ayudantes útiles incluye:

  • TimeHelper : hace que la visualización de fechas y horas sea muy sencilla, proporcionando un conjunto de funciones para formatear y evaluar valores de tiempo.
  • NumberHelper : proporciona métodos convenientes para mostrar números en una variedad de formatos y precisiones comunes (o personalizados).
  • TextHelper : ayuda a habilitar enlaces, dar formato a URL, crear extractos de texto alrededor de palabras o frases seleccionadas, resaltar palabras clave en bloques de texto y truncar con gracia largos tramos de texto.

Y hay muchos más.

Críticas a CakePHP 3

Sin duda, cada marco tiene sus pros y sus contras, y CakePHP no es una excepción. Estas son algunas de las críticas más comunes dirigidas a CakePHP fuera de esta revisión:

  • “Marco heredado; hinchado y lento. Esta crítica es típicamente más histórica, con una verdad limitada (si es que tiene alguna) hoy. El soporte de versiones de PHP desde PHP 4 ha requerido históricamente que CakePHP se ocupe de muchos de los problemas heredados propios de PHP. Con la maduración de PHP, y con el lanzamiento de la versión 3 de CakePHP en particular, esta acusación realmente ha perdido su validez.

  • “Demasiado estricto y restrictivo”. Si bien existen claras ventajas en las convenciones de CakePHP, hay quienes las critican. Los críticos a menudo argumentan que las convenciones son demasiado estrictas, pero no reconocen (o reconocen) que estas convenciones pueden anularse fácilmente. Al adoptar un conjunto estándar de convenciones, Cake busca hacer que el desarrollo sea consistente, lo que, dadas las prácticas de codificación de PHP, por lo demás poco estrictas, solo debería verse como algo positivo.

  • “Ciclo de liberación lenta”. Un ciclo de liberación lenta no es necesariamente malo. Por el contrario, un ciclo de lanzamiento que es demasiado agresivo en realidad puede ser más problemático. De hecho, parte de la razón por la que las versiones principales de CakePHP toman tiempo es para garantizar la compatibilidad con versiones anteriores de PHP que aún se implementan ampliamente. Además, este ciclo de lanzamiento conservador y el énfasis en la compatibilidad con versiones anteriores eliminan la necesidad de cambios importantes (y frecuentes) en su código cuando se lanzan nuevas versiones. También se debe tener en cuenta que el equipo de CakePHP 3 es cualquier cosa menos lento cuando se trata de versiones menores (corrección de errores, parches, mejoras menores, etc.), que se publican mensualmente . Del mismo modo, la mayoría de los tickets de errores se responden a las pocas horas de su publicación.

  • “No es una solución lista para usar”. A diferencia de muchos otros marcos PHP modernos de "aplicación web lista para usar" (como Yii, por ejemplo), CakePHP busca deliberadamente admitir y habilitar soluciones personalizadas. Personalmente, me he beneficiado enormemente de esto al desarrollar una serie de sitios web y aplicaciones grandes, personalizados y basados ​​en bases de datos.

  • "Utiliza matrices de datos en lugar de objetos". Esto ya no es cierto, a partir de la versión 3. En versiones anteriores, los datos debían almacenarse y referenciarse como matrices anidadas (por ejemplo, $user['User']['username'] ). CakePHP 3 finalmente aborda esto, en lugar de almacenar datos como objetos (por ejemplo, $user->username ).

  • “Documentación pobre.” Hay algo de validez en esta crítica, ya que la documentación de CakePHP no siempre parece haber sido escrita pensando en el principiante (a veces, la información importante se analiza en solo una oración o dos, mientras que algunos párrafos de discusión probablemente se habrían justificado). ). El equipo de desarrollo de Cake es consciente de esto y está trabajando para mejorar la documentación en consecuencia. De hecho, la página de inicio de la documentación de CakePHP 3 establece explícitamente un alto nivel de compromiso con la "calidad, validez y precisión" de la documentación. Como CakePHP es un marco impulsado por la comunidad, se proporciona un botón "Mejorar este documento" en cada página de la documentación, lo que permite y alienta a los usuarios de CakePHP a contribuir con sus propias adiciones, eliminaciones o correcciones a la documentación.

Conclusión

En general, casi 10 años después de su lanzamiento inicial, una revisión de CakePHP revela que sigue siendo un competidor vibrante y formidable para muchos otros marcos PHP que han surgido desde entonces.

CakePHP es una solución de desarrollo completa e integral. El código base es maduro y la funcionalidad parece infinita. En general, Cake se creó para acelerar el desarrollo, lo cual es importante no solo para los desarrolladores de software, sino también para los inversores. El mayor costo del desarrollo de software es el costo del tiempo de desarrollo, y CakePHP tiene como objetivo reducir significativamente el tiempo de desarrollo.

CakePHP es un proyecto administrado por la comunidad. Solo puede mejorar a medida que más y más personas se involucran. Después de haber estado involucrado durante 7 años y haber visto a la comunidad seguir creciendo, estoy entusiasmado con la próxima etapa de CakePHP. El lanzamiento de CakePHP 3 y la madurez de PHP y CakePHP significa que el marco seguirá mejorando cada vez más.

Si está buscando una solución basada en PHP que ofrezca muchos beneficios similares a Ruby on Rails (en términos de facilidad de uso y convención sobre la configuración), entonces pruebe CakePHP. Sin embargo, el tutorial del blog de CakePHP solo toma unos minutos para configurarlo y ejecutarlo, o alternativamente, CakeCoded ofrece una serie de lecciones claras para ayudar a un desarrollador de PHP a familiarizarse con CakePHP y comenzar a usarlo. Con estos recursos, verá rápidamente hasta qué punto CakePHP puede acelerar y mejorar sus esfuerzos de desarrollo de software PHP. ¡Disfrutar!


Michael Houghton es un ingeniero de Toptal con sede en Irlanda y una amplia experiencia en CakePHP. Ha desarrollado más de 100 sitios web con el marco, ha trabajado con el equipo de CakeDC (la entidad comercial detrás del marco CakePHP), ha enviado varios parches y ha ayudado con la documentación de CakePHP.