Uso de espacios de nombres y carga automática en los complementos de WordPress, Parte 4

Si este es el primer tutorial que está leyendo en esta serie, entonces recomiendo ponerse al día con lo que hemos cubierto hasta ahora..

Esencialmente, vas a entrar al final del show. En este punto, hemos sentado las bases para nuestro complemento, hemos escrito el complemento, y hemos definido y explorado los espacios de nombres y los autocargadores. Todo lo que queda es aplicar lo que hemos aprendido..

Así que en este tutorial, vamos a poner todas las piezas juntas. Específicamente, revisaremos el código fuente de nuestro complemento, espaciaremos el nombre de todas las clases relevantes y escribiremos un autocargador para que podamos eliminar todas nuestras declaraciones de inclusión.

Discutiré todo en detalle mientras trabajamos a través del código. Nuevamente, si este es el primer tutorial que estás leyendo en esta serie, ponte al día con lo que hemos cubierto hasta ahora y luego vuelve a este tutorial..

Antes de escribir cualquier código

En este punto, debe estar familiarizado con la forma en que hemos configurado nuestro entorno de desarrollo. Como actualización, aquí hay un resumen rápido del software que estamos usando:

  • al menos PHP 5.6.20
  • el servidor web apache
  • un servidor de base de datos MySQL
  • WordPress 4.6.1
  • un conocimiento práctico de la API del complemento de WordPress

También necesitará una copia del código fuente del complemento con el que estamos trabajando. Puedes tomar una copia de esto aquí. Suponiendo que esté instalado, activado y que tenga su IDE en ejecución, comencemos.

Nombrar el código

Recuerde del tutorial anterior, soy un fan de asegurarme de que nuestros espacios de nombres sigan la organización de los archivos en el disco. Si observa la estructura de directorios de nuestro complemento o si ha seguido las series hasta ahora, debería ver algo como esto:

Tenga en cuenta que si ha configurado su complemento de forma diferente, está bien. Es probable que sus espacios de nombres sean diferentes, pero eso no debería afectar a nada que esté cubierto en esta serie.

Usando la estructura del directorio como una guía, repasemos todos los archivos PHP que forman nuestro complemento y definimos sus espacios de nombres. Hacer esto es fácil: es simplemente una cuestión de usar la palabra clave del espacio de nombres y colocar un nombre calificado en la parte superior de cada archivo.

Voy a enumerar cada uno a continuación.

tutsplus-namespace-demo.php

class-meta-box.php

class-meta-box-display.php

interfaz-activos.php

class-css-loader.php

clase-pregunta-lector.php

Hay algunas cosas que notar sobre las convenciones que he usado anteriormente:

  • El espacio de nombres de la raíz es Tutsplus_Namespace_Demo, que corresponde al nombre del directorio del complemento.
  • El resto de los espacios de nombres como Tutsplus_Namespace_Demo \ AdminTutsplus_Namespace_Demo \ Admin \ Util También corresponden a sus respectivos directorios; sin embargo, los nombres de directorio están en mayúsculas (en lugar de estar en minúsculas).

Finalmente, si ha intentado actualizar la página o ha intentado navegar por WordPress desde que introdujo las declaraciones de espacio de nombres, entonces es probable que vea un error en su consola que se parece a esto:

E incluye el siguiente mensaje:

Advertencia de PHP: call_user_func_array () espera que el parámetro 1 sea una devolución de llamada válida, no se encontró la función 'tutsplus_namespace_demo' o el nombre de la función no válida en /Users/tommcfarlin/Dropbox/Projects/tutsplus/wp-includes/plugin.php en la línea 524

O tal vez se muestra:

Error fatal de PHP: no se encuentra la clase 'Meta_Box' en /Users/tommcfarlin/Dropbox/Projects/tutsplus/wp-content/plugins/tutsplus-namespace-demo/tutsplus-namespace-demo.php en la línea 48

O puede ver cualquier número de otros mensajes de error similares. Esta bien. Es normal.

Pero plantea la pregunta: ¿Qué pasa con nuestro complemento? Por suerte, nada. Este es el comportamiento esperado..

El primer mensaje que ves mayo ser el resultado de otro plugin que tengas instalado. No pude reproducirlo por su cuenta; sin embargo, cuando desactivo algunos de los otros complementos que tengo en ejecución, el complemento generó el segundo mensaje (que es el mensaje que quería mostrar).

Cuando creas un código de espacio de nombres, PHP espera localizar una clase dentro de un espacio de nombres dado. Conceptualmente, puede pensar que sus clases ahora pertenecen a su propio paquete (o subpaquete) o como lo define. Y para que una función acceda a una clase dentro de un paquete, debe ser consciente de los paquetes que existen.

Aquí es donde la funcionalidad de espacio de nombres adicional y la carga automática entran en juego. Entonces, antes de intentar acceder a nuestro código a través de sus espacios de nombres, trabajemos en un autoloader.

Todo sobre autocarga

Escribir un autoloader requerirá lo siguiente:

  1. entendiendo una función de PHP llamada spl_autoload_register
  2. escribiendo una función que cargará automáticamente nuestros archivos de espacio de nombre
  3. Incluyendo nuestra función de carga automática personalizada

No dejes el nombre spl_autoload_register intimidarte Simplemente significa que esta es una función que forma parte de la "Biblioteca estándar de PHP" y es la forma en que "registramos" una función de "carga automática". Es difícil decirlo y escribir muchos caracteres, pero es solo una función que usaremos para decirle a PHP cómo analizar los espacios de nombres y los nombres de las clases y dónde puede encontrar nuestros archivos..

Esta función es lo que nos permite escribir nuestro propio código personalizado para cargar archivos automáticamente y luego conectar dicha función a PHP. Es decir, vamos a decirle a PHP dónde encontrar nuestros archivos y cómo analizar los espacios de nombres, los nombres de los archivos, etc. para que incluya los archivos..

Dicho todo esto, estamos listos para escribir un autocargador.

Escribiendo un autocargador

Al escribir un autocargador, lo que hay que tener en cuenta es cómo se organizan nuestros archivos. Es decir, queremos saber cómo asignar nuestros espacios de nombres a nuestros directorios. 

En el ejemplo que estamos usando, es simple: los espacios de nombres son versiones en caja de la estructura del directorio. Esto no siempre es cierto para otros proyectos; sin embargo, es otra razón por la que me gusta organizar lógicamente mis archivos según su ubicación física.

Cuando PHP intente cargar una clase, nuestro autocargador tendrá que hacer lo siguiente:

  1. Dividir el espacio de nombres en función de las barras..
  2. Divida el paquete y los subpaquetes en función de los guiones bajos y reemplácelos con guiones (si es necesario).
  3. Sepa cómo asignar nombres de clase, interfaces, etc. a nombres de archivo.
  4. Cree una representación de cadena del nombre de archivo en base a la información anterior.
  5. Incluir el archivo.

Con todos esos puntos hechos, tenemos nuestro trabajo por delante. En el directorio del complemento, cree un subdirectorio llamado Cía, y en el Cía directorio crear un archivo llamado autoload.php.

Dentro de ese archivo, sigamos adelante y apaguemos la función que vamos a utilizar para cargar automáticamente nuestros archivos. Debería verse algo como esto:

Obviamente, esto no está haciendo nada todavía..

Una nota al margen sobre la escritura de un autocargador

Tenga en cuenta que voy a escribir el código y los comentarios del código para explicar detalladamente lo que estamos haciendo. Si solo se está aventurando en esto por su cuenta por primera vez, escribir un cargador automático junto con el uso de espacios de nombres y trabajar con archivos puede ser un poco frustrante. Aquí es donde un depurador y el uso de archivos de registro pueden ser útiles. 

Esto está fuera del alcance de este tutorial, pero sepa que escribir un autocargador no es algo que pueda corregir correctamente la primera vez que lo haga..

Completando el autocargador

Comencemos a agregar algunas funciones dados los pasos enumerados al principio de esta sección..

Primero, debemos configurar un bucle que vaya a iterar hacia atrás a través de las partes del nombre de archivo que se pasan a la función de carga automática. Hacemos esto porque hace que sea más fácil construir una ruta al archivo para que se cargue automáticamente.

 0; $ i--) // Más por venir ... 

Después de esto, tenemos que mirar el $ file_parts y reemplace todas las apariciones del guión bajo por un guión porque todos los nombres de nuestras clases y nuestra interfaz usan guiones bajos, mientras que nuestros nombres de archivo usan guiones.

Las siguientes dos líneas son las primeras dos líneas dentro del bucle que destacamos anteriormente:

A continuación, vamos a necesitar un condicional que haga algunas cosas..

  1. Debe verificar para ver qué entrada de la ruta del nombre de archivo que estamos leyendo.
  2. Si estamos en la primera entrada, entonces estamos en el nombre del archivo; De lo contrario, estamos en su espacio de nombres..
  3. A continuación, si estamos leyendo la primera entrada, debemos determinar si estamos intentando cargar automáticamente una interfaz o si estamos cargando una clase.
  4. Si es el primero, entonces necesitamos ajustar el nombre de la interfaz para que podamos cargarla correctamente en función de su nombre de archivo; de lo contrario, cargaremos la clase en función del valor en el $ actual variable.

Se lee mucho, pero no debería ser terriblemente complicado de leer. Vea el código comentado abajo:

Una vez hecho esto, es hora de construir una ruta de acceso completa al archivo. Afortunadamente, esto es poco más que una concatenación de cadenas básica:

Por último, necesitamos asegurarnos de que el archivo existe. Si no, mostraremos un mensaje de error estándar de WordPress:

Y en este punto, tenemos un cargador automático completo (que puede recuperarse descargando los archivos del enlace en la barra lateral de esta publicación, ya que el código fuente sería un poco largo para publicar aquí en el tutorial).

Finalmente, es importante tener en cuenta que esta función en particular podría (o debería) reescribirse como una clase. Además, la clase debe constar de varias funciones más pequeñas de las que se puedan probar, tener una sola responsabilidad y leer más claramente de lo que está arriba. Tal vez en un tutorial adicional, repasaré el proceso de cómo se vería eso..

Pero seguimos incluyendo archivos

Si observa cerca de la parte superior del archivo del complemento principal (o del archivo de rutina de carga que hemos llamado a menudo), observará varias incluir declaraciones que se ven así:

Dado el trabajo que hemos realizado hasta este momento, finalmente podemos eliminar estas afirmaciones y reemplazarlas por una sola:

Para ser claros, lo estamos reemplazando con nuestro autoloader. En este punto, deberíamos haber terminado con nuestro plugin..

Poniendolo todo junto

Ahora que hemos espaciado nuestro código para proporcionar una organización lógica de clases relacionadas, y hemos escrito un autocargador para incluir automáticamente los archivos en función del espacio de nombres y la ubicación de cada clase, deberíamos poder iniciar nuestro complemento y ejecutarlo exactamente como lo hizo. durante la primera iteración exitosa.

Lo último que debemos hacer es asegurarnos de actualizar el archivo de rutina de carga para que le indiquemos a PHP que use los espacios de nombres para el Meta_Box, Meta_Box_Display, la Question_Reader, y el CSS_Loader.

en eso(); $ meta_box-> init (); 

Aviso en el código anterior estamos usando PHP's utilizar palabra clave, y estamos prefijando nuestros nombres de clase con sus subpaquetes inmediatos. Puedes leer más sobre el uso en el manual, pero el resumen es:

los utilizar la palabra clave se debe declarar en el ámbito más externo de un archivo (el ámbito global) o dentro de las declaraciones de espacio de nombres. Esto se debe a que la importación se realiza en tiempo de compilación y no en tiempo de ejecución, por lo que no puede tener un ámbito de bloque. 

Dicho esto y suponiendo que todas las obras funcionen correctamente, debería poder navegar a Añadir nueva publicación página (o Editar post), vea nuestro cuadro de meta y vea un indicador de preguntas en la parte superior de la barra lateral:

Si es así, entonces felicitaciones. Has configurado correctamente tu complemento a tus espacios de nombre y carga automática. Si no es así, vuelva a verificar el código con lo que hemos compartido aquí, revise sus registros de errores y asegúrese de que no aparezca nada fuera de lo común en la pantalla de administración de WordPress.

Si tu hacer Ver algo, lo más probable es que tenga que ver con algo menor. Revise el código que hemos cubierto, compárelo con lo que se adjunta aquí a esta publicación (en la barra lateral junto con el botón azul grande) y vea si puede reducir el problema.

Conclusión

En este punto, hemos llegado al final de nuestra serie. A lo largo de los últimos cuatro tutoriales, hemos cubierto mucho terreno:

  • Hemos creado un complemento que hace que los usuarios hagan preguntas para ayudar a iniciar sus blogs..
  • Hemos utilizado las funciones de PHP para leer archivos del sistema de archivos y representarlos en la pantalla.
  • Hemos definido los espacios de nombres y la carga automática, y hemos echado un vistazo a cómo se pueden aplicar.
  • Organizamos nuestro código y escribimos nuestro propio autocargador, haciendo que el código sea más legible, organizado y menos saturado..

En última instancia, gran parte del material cubierto a lo largo de esta serie se puede utilizar en proyectos existentes y futuros en los que pueda estar trabajando.. 

Recuerde que también puede encontrar otros productos relacionados con WordPress en nuestro mercado. Y si desea obtener más información sobre el desarrollo de soluciones para WordPress, puede encontrar todos mis tutoriales y series en mi página de perfil. No dude en seguirme en mi blog o en Twitter, ya que converso sobre el desarrollo de software en el contexto de WordPress casi a diario..

Y recuerde, el enlace es para descargar el código fuente final en la barra lateral debajo de un botón titulado Descargar adjunto. Por supuesto, no dudes en hacer cualquier pregunta en los comentarios.!

Recursos

  • spl_autoload_register
  • utilizar