Uso de un contenedor de servicio para mejorar su código de WordPress

En este artículo, el primero de una serie, presentaré el concepto de contenedor y le mostraré cómo construir e implementar un contenedor muy simple pero limitado. Este artículo ilustra el concepto usando un singleton, que no es óptimo, pero es simple. Recuerde, este ejemplo de código comenzará con el uso de un singleton. Sé que esta no es la mejor práctica, pero facilitará que enseñar sobre contenedores. Finalmente, eliminaré el modelo Singleton de la clase de contenedores como una forma de explicar el verdadero problema con los singletons. Las nociones introductorias con contenedores piensan en un contenedor como el objeto central que almacena o puede crear objetos en su aplicación. La necesidad de contenedores aparece desde la tensión entre la necesidad de los tribunales mientras usa la inyección de adicción.
Con esto, comencemos mirando el problema que estamos tratando de evitar. Imagine escribir una clase para interactuar con un Twitter de feed. Esto requerirá una forma de trabajar y almacenar una cuenta de Twitter, que debería ser su propia clase, para que pueda tener más cuentas y reutilizar esa clase. Esto también requerirá un cliente de API, que debería ser su propia clase, porque esta es una preocupación separada y útil. Entonces, ahora, tenemos una clase, llamada TwitterFeed, que requiere otras dos clases para funcionar. La forma más fácil de hacer esto sería la siguiente:
twitterAccount = nuevo TwitterAcCount ();
$ this-> twitterapi = new TwitterApi ();
}
} Para que esta implementación funcione, debemos agregar una lógica a la clase TwitterFeed para obtener la cuenta correcta y conectarla al cliente API. Acabamos de agregar dos nuevas responsabilidades a TwitterFeed, sin agregar la capacidad de TwitterFeed para obtener una Feed Twitter.
Una representación antropomórfica del principio de responsabilidad única ingresa a la habitación y nos mira con decepción. No está molesto, pero sabe que lo sabemos mejor y está decepcionado. Aquí hay una nueva versión de la clase TwitterFeed, que toma los otros dos objetos como adicciones. twitterAccount = $ twitterAccount;
$ this-> twitterapi = $ twitterapi;
}
} Usando la inyección de adicción, resolví el problema de demasiadas preocupaciones en este objeto. Pero esto en realidad se ha vuelto más difícil de usar. Es mejor tener solo una instancia de la clase Twitterapi, por lo que queremos un tribunal global accesible de esa clase.
Por otro lado, deberíamos querer tener más cuentas. Incluso si comenzamos nuestro complemento con una sola cuenta, el diseño para la posibilidad de más cuentas es una buena solución a largo plazo. Sin embargo, no queremos más instancias de TwitterCount por cuenta. Es un desperdicio en términos de recursos y hará que la función del complemento sea impredecible, porque nunca sabemos qué corte actualizamos. Estructurar alrededor de un contenedor para comenzar creando un contenedor de arado básico y agregando una sola corte de Twitterapi. En ambos escenarios presentados anteriormente, esto debe ser accesible a nivel mundial y, por lo tanto, la implementación del modelo Singleton para nuestro contenedor podría resolver este problema. No es ideal, pero es simple, así que hagámoslo primero comprender el patrón. Aquí está la clase, que utiliza el modelo Singleton para imponer una instancia y luego implementar el modelo de depósito para almacenar otros objetos en este Tribunal. El primer objeto agregado es TwitterAPI por el método GetTwitTitterapi. Tenga en cuenta que es perezoso: el tribunal se crea solo cuando es necesario y una vez. objetos [__metoda__])) {$ this-> objcts [__method__] = new TwitterApi ();
}
Devuelve $ this-> objetos [__metoda__];
}
} Ahora tenemos una instancia global accesible de la clase Twitterapi, sin tener que imponer el singleton en Twitterapi. Ahora podemos escribir pruebas que usen clases simuladas de Twitterapi o crear nuevos tribunales, si es necesario más adelante.
Fábricas de contenedores En la última sección, agregué un método para obtener una sola instancia de la clase TwitterAPI en el contenedor. Nuestro siguiente paso es permitir el uso de varios tribunales de la clase TwitterCount, pero solo uno para cada cuenta. Antes de que podamos implementar esto en el contenedor, necesitaremos una fábrica para los objetos de TwitterCount. Esta es una preocupación de fábrica separada. Primero, para restaurar el objeto TwitterCount para aceptar un nombre de usuario como adicción. Esto hace que cada objeto sea único. userssname = $ username;
}
} Ahora podemos construir una fábrica para crear estos objetos que los obtienen de la base de datos si es posible. En esta fábrica, uso las opciones API en lugar de una abstracción adecuada de la base de datos por simplicidad.
Clase de TwitterCountFactory
{
/**
* Crear instancias de TwitterCount, posiblemente a partir de los datos guardados
*
* @param cadena $ nombre de usuario
*
* @return twitterAccount
*/
Función pública pública get (cadena $ nombre de usuario): TwitterAccount
{
$ Saved = get_option (‘_prefixAccount’. $ UserName);
if ($ guardado) {
devolver $ guardado;
}
Devuelve el nuevo TwitterAccount ($ UserName);}
} Tenga en cuenta que esta fábrica no implementa el modelo de depósito. Es tentador agregar uno, pero ese no es el trabajo de los cursos. Dejar esto solo creando objetos significa que podemos usar el contenedor principal como un almacén o crear un almacén separado. Hagamos la primera opción porque es más simple.
<? Php
Contenedor de clase {
/** @Var Container*/
$ Tribunal estático protegido;

/**
* Contiene objetos perseguidos
*
* @Var Matrix
*/
$ objetos protegidos;
La función protegida __construct () {}
/**
* Obtenga una instancia de contenedor
*
* @contenedor
*/
La función pública pública geinstance (): contenedor
{
If (! Static :: $ instancia) {
static :: $ instancia = new static ();
}
Regreso static :: $ Court;
}
/**
* Obtenga el cliente de Twitter
*
* @return twitterapi
*/
Función pública getTwitterapi (): Twitterapi
{
if (! isset ($ this-> objetos [__metoda__])) {
$ this-> objetos [__method__] = new TwitterApi ();
}
Devuelve $ this-> objetos [__metoda__];
}
/**
* Obtenga una cuenta de Twitter por nombre de usuario
*
* @param cadena $ nombre de usuario
*
* @return twitterAccount
*/
Función pública getTwitterAccount (cadena $ nombre de usuario): TwitterAccount
{
$ arraykey = md5 (__metoda__. $ username);
if (! isset ($ this-> objetos [$ arreraykey]) {
$ this-> objetos [$ arraykey] = twitterAcontFactory :: get ($ username);
}
Devuelve $ this-> objetos [$ ArrayKey];
}
} El nuevo método en el contenedor getTwitterAccount () primero verifica si un objeto para esta cuenta está en el almacén de objetos del contenedor. De lo contrario, use la clase TwitterACoountFactory para crear una nueva y agregarlo al almacén. Al reunir todo ahora, para que nuestro contenedor pueda proporcionar objetos de cuenta Twitter y el “Tribunal principal” de la clase Twitterapi, podemos crear una fábrica para TwitterCounts Eso reúne que usa el contenedor nuestro para proporcionar adicciones a la clase TwitterFeed. getTwitterAccount ($ username),
Container :: getInstance ()-> getTwitterapi ()
);
}
} Ahora tenemos una manera fácil de crear objetos de TwitterFeed por nombre de usuario sin tener que crear el cliente de API o la lógica de cuentas o interacciones con bases de datos para almacenar detalles de la cuenta en TwitterFeed.
Misión parcialmente cumplida. Por qué es subóptimo al evitar el uso de singles en TwitterCount y Twitterapi, son más fáciles de reutilizar y escribir pruebas unitarias. Pero, todo el complemento ahora está fuertemente relacionado con este único tribunal del contenedor. Una desventaja importante de los singles es que no puedes descansar, que es algo que tienes que hacer entre cada prueba. Además, solo podemos tener un contenedor por complemento y no podemos reutilizar la clase en otros complementos correctamente. Entonces, restauremos el contenedor para no confiar en Singleton, sino para mantenerlo accesible a nivel mundial. Es fácil, solo eliminamos la propiedad de la corte y el método GetInstance y hacemos público al constructor. Además, es posible que deseemos usar un almacén más genérico para nuestro contenedor, como el que hemos mostrado en mi artículo de almacenamiento, o usar un contenedor preconstruido como Pimple. Mostraré la última opción en mi próximo artículo. Por ahora, para construirlo desde cero. Aquí está el contenedor, sin el modelo Singleton. Ahora, podemos crear una nueva instancia de este contenedor para cada prueba unitaria, podemos crear más contenedores. Pero con el modelo Singleton perdido, no podemos obtener la corte de este contenedor, lo cual es un problema. Así que creemos una función para rastrear esa cancha. <? Php/**
* Obtenga la instancia de contenedor principal
*
* @contenedor
*/
Function Container (): Container
{
$ contenedor estático;
If (! $ Container) {
$ contenedor = nuevo contenedor;
}
Devuelve $ contenedor;

Copyright statement: Unless otherwise noted, this article is Collected from the Internet, please keep the source of the article when reprinting.

Check Also

gkOVSBm5B8SgiXmo

Shopify vs WooCommerce – ¿Cuál es la mejor plataforma?(Comparación)

Shopify vs WooCommerce

Leave a Reply

Your email address will not be published. Required fields are marked *