Carga automática orientada a objetos en WordPress, Parte 3

En el último tutorial, revisamos el estado original de nuestro autocargador y luego pasamos por un proceso de análisis y diseño orientado a objetos. El propósito de hacer esto es para que podamos unir todo lo que hemos cubierto en esta serie y la serie introductoria.. 

En segundo lugar, el propósito de hacer esto en su propio tutorial es que podamos pasar el resto de este tiempo recorriendo nuestra clase, viendo cómo encaja cada parte, implementándola en nuestro complemento y luego viendo cómo aplicar la programación orientada a objetos y el El principio de responsabilidad única puede llevar a una solución más enfocada y mantenible..

Antes de que comencemos

En este punto, asumo que has estado siguiendo esta serie. Si no es así, por favor revise la parte uno y la parte dos. Este asume que has estado siguiendo hasta ahora.

Si eres un principiante, también recomiendo leer la serie inicial en su totalidad. Una vez que esté al día, debería estar en una buena posición para terminar la serie, ya que concluimos con el resto del código fuente cubierto en este tutorial..

Lo que hemos hecho hasta ahora

Para proporcionar un resumen rápido y asegurarnos de que todos estemos en la misma página, hemos cubierto los siguientes temas de esta serie:

  • revisó la definición de una interfaz de clase
  • visto cómo una clase implementa una interfaz
  • repasó el principio de responsabilidad única
  • Analizamos nuestro autoloader existente.
  • creó una hoja de ruta para nuestra versión orientada a objetos del autocargador
  • y diseñó una implementación básica para una versión orientada a objetos del autocargador

En este punto, estamos listos para intercambiar nuestro cargador automático existente con el código basado en objetos. Tenga en cuenta, sin embargo, que esto no será una simple cuestión de cambiar archivos. 

Qué necesitamos hacer

En lugar de eso, necesitaremos crear los archivos, asegurarnos de que siguen los Estándares de codificación de WordPress, implementarlos, probar su implementación para asegurarse de que el complemento aún funciona y luego eliminar el autocargador existente..

Parece un montón de trabajo, pero si nuestro análisis y diseño del tutorial anterior se realizó correctamente y resulta ser preciso, no tendremos problemas para hacer todo lo que se menciona arriba..

Su entorno de desarrollo

Antes de saltar a la implementación, quiero proporcionar un resumen rápido del entorno de desarrollo que debe tener en su sistema. Técnicamente, esto es algo que ya debería haber ejecutado según las instrucciones de los tutoriales anteriores, pero quiero ser lo más completo posible.

  • Un entorno de desarrollo local adecuado para su sistema operativo.
  • un directorio del cual WordPress 4.6.1 está siendo alojado
  • un editor de texto o IDE
  • conocimiento de la API de WordPress Plugin

Dicho esto, vamos a empezar.

Implementación orientada a objetos

En esta sección, vamos a revisar todo el código que revisamos en el tutorial anterior; Sin embargo, veremos cada archivo individual junto con la documentación completa..

Además, lo incluiremos en nuestro proyecto para que al final del tutorial podamos usar este código en lugar del código único basado en procedimientos que usamos anteriormente..

Tenga en cuenta que cada uno de los siguientes archivos debe nombrarse como se indica y debe incluirse en el Cía directorio. Además, todo esto está disponible para descargar usando el botón azul en la barra lateral de esta publicación..

class-autoloader.php

namespace_validator = new NamespaceValidator (); $ this-> file_registry = new FileRegistry ();  / ** * Intenta cargar el nombre de archivo especificado. * * @param string $ nombre_archivo La ruta al archivo que estamos intentando cargar. * / public function load ($ filename) si ($ this-> namespace_validator-> is_valid ($ filename)) $ this-> file_registry-> load ($ filename);  

class-namespace-validator.php

class-file-investigator.php

get_file_name ($ file_parts, $ current, $ i); if (count ($ file_parts) - 1! == $ i) $ filepath = trailingslashit ($ filepath);  devolver $ filepath;  / ** * Recupera la ubicación de parte del nombre de archivo en el disco según el índice actual de la matriz que se está examinando. * * @access private * @param array $ file_parts La matriz de todas las partes del nombre del archivo. * @param string $ current La parte actual del archivo a examinar. * @param int $ i El índice actual de la matriz de $ file_parts para examinar. * @return string El nombre del archivo en el disco. * / private function get_file_name ($ file_parts, $ current, $ i) $ filename = "; if (count ($ file_parts) - 1 === $ i) if ($ this-> is_interface ($ file_parts))  $ filename = $ this-> get_interface_name ($ file_parts); else $ filename = $ this-> get_class_name ($ current); else else $ person = $ this-> get_namespace_name ($ current); ; / ** * Determina si el archivo especificado que se está examinando es una interfaz. * * @Access private * @param array $ file_parts Las partes de la ruta de archivo a examinar. * @Return bool True si la interfaz está contenida en el nombre del archivo; de lo contrario , false. * / private function is_interface ($ file_parts) return strpos (strtolower ($ file_parts [count ($ file_parts) - 1]), 'interface'); / ** * Recupera el nombre de archivo de la interfaz basado en partes específicas del archivo pasadas * al autocargador. * * @access private * @param array $ file_parts La matriz de partes del archivo a examinar. * @return string El nombre de archivo de la interfaz. * / private fu nction get_interface_name ($ file_parts) $ interface_name = explode ('_', $ file_parts [count ($ file_parts) - 1]); $ interface_name = $ interface_name [0]; devuelve "interface- $ interface_name.php";  / ** * Genera el nombre del nombre de archivo de la clase en el disco. * * @access private * @param string $ current La parte actual del nombre del archivo a examinar. * @return string El nombre de archivo de la clase en el disco. * / private function get_class_name ($ current) return "class- $ current.php";  / ** * Crea una asignación del espacio de nombres a la estructura del directorio. * * @access private * @param string $ current La parte actual del archivo a examinar. * @return string La ruta de la asignación del espacio de nombres a la estructura del directorio. * / función privada get_namespace_name ($ current) return '/'. $ corriente;  

class-file-registry.php

investigador = nuevo FileInvestigator ();  / ** * Utiliza el investigador de archivos para recuperar la ubicación del archivo en el disco. Si se encuentra, entonces * lo incluirá en el proyecto; de lo contrario, lanzará un mensaje de error de WordPress. * * @param string $ filepath La ruta al archivo en disco para incluir en el complemento. * / public function load ($ filepath) $ filepath = $ this-> investigator-> get_filetype ($ filepath); $ filepath = rtrim (plugin_dir_path (dirname (__FILE__)), '/'). $ filepath; if (file_exists ($ filepath)) include_once ($ filepath);  else wp_die (esc_html ('El archivo especificado no existe.'));  

Incluyendo los archivos, iniciando el autocargador

Ahora que hemos creado nuestros archivos, necesitamos hacer dos pequeños cambios más:

  1. Necesitamos incluir todas las clases en el directorio inc..
  2. Necesitamos deshacernos del antiguo código del autocargador..
  3. Y necesitamos usar nuestro nuevo autocargador con el spl_autoload_register función.

En última instancia, la versión final de autoload.php debería tener este aspecto:

Y logrará exactamente lo que hemos descrito anteriormente..

Pero espera, estoy recibiendo un error!

En este punto, has hecho mucho trabajo. Usted ha refaccionado su cargador automático completo para usar la programación orientada a objetos. Has documentado tus clases y funciones. Ha creado nuevos archivos, ha eliminado el código de los archivos antiguos y está listo para asegurarse de que todo funciona como se esperaba.

Entonces, como haría cualquier desarrollador, inicia la ventana del navegador para actualizar la página, solo para que aparezca un mensaje de error:

Por suerte, esta es una solución fácil. El problema es que estamos intentando agregar nuestro meta box demasiado pronto. Para solucionar esto, actualizaremos el en eso método en nuestro Meta_Box clase para incluir esto:

Y luego presentaremos una función que se enganchará al trabajo que acabamos de hacer:

display, 'render'), 'post', 'side', 'high'); 

En este punto, debe poder ejecutar el nuevo código sin problemas, sin advertencias, sin avisos y sin errores.

Conclusión

Trabajar a través de todo esto podría haber parecido mucho, ¡y lo fue! Pero lo bueno es que cubrió mucho terreno en tres tutoriales., y Se basó en el trabajo de una serie anterior. En ese sentido, se cubrieron muchos temas nuevos y se aprendieron nuevas técnicas..

Tenga en cuenta que escribo regularmente para Envato Tuts +, y puede encontrar todos mis tutoriales anteriores en mi página de perfil. Además, a menudo discuto el desarrollo de software en el contexto de WordPress en mi blog y en Twitter, así que no dude en seguirme en cualquier lugar..

Dicho esto, estudie el código que hemos cubierto a lo largo de esta serie (y quizás el anterior) y vea si no puede emplear algunas de estas técnicas en su trabajo actual o futuro..

Recursos

  • Uso de espacios de nombres y carga automática en los complementos de WordPress
  • Autocarga orientada a objetos en WordPress, Parte 1
  • Orientación automática a objetos en WordPress, Parte 2
  • Espacios de nombres
  • Autocarga
  • Interfaces
  • La API del plugin de WordPress
  • Principio de Responsabilidad Única