Fábricas

Introducción

¿Qué son las fábricas?

Como Servicios, Factories son una extensión de carga automática que ayuda a mantener su código conciso pero óptimo, sin tener que pasar instancias de objetos entre clases.

Las fábricas son similares a $this->load de Higgs 3 en los siguientes puntos:

  • Cargar una clase

  • Compartir la instancia de clase cargada

En su Más simple, las fábricas proporcionan una forma común de crear una instancia de clase y acceder a ella desde en cualquier lugar. Esta es una excelente manera de reutilizar los estados de los objetos y reducir la carga de memoria para mantener múltiples instancias cargadas en su aplicación.

Las fábricas pueden cargar cualquier clase, pero los mejores ejemplos son aquellas clases que se utilizan para trabajar o transmitir datos comunes. El marco en sí utiliza fábricas internamente, por ejemplo, para asegúrese de que se cargue la configuración correcta cuando utilice la clase Config.

Diferencias con los servicios

Las fábricas requieren un nombre de clase concreto para crear instancias y no tienen código para crear instancias.

Entonces, las fábricas no son buenas para crear una instancia compleja que necesita muchas dependencias. y no puede cambiar la clase de la instancia que se devolverá.

Por otro lado, los Servicios tienen código para crear instancias, por lo que pueden crear una instancia compleja. que necesita otros servicios o instancias de clase. Cuando obtiene un servicio, los Servicios requieren un nombre de servicio, no es un nombre de clase, por lo que la instancia devuelta se puede cambiar sin cambiar el código del cliente.

Cargando clases

Cargando una clase

Eche un vistazo a Modelos como ejemplo. Podrás acceder a la Fábrica específica de Modelos utilizando el método estático mágico de la clase Fábricas, Factories::models().

El nombre del método estático se llama componente.

Pasar nombre de clase sin espacio de nombres

Si pasa un nombre de clase sin un espacio de nombres, Factories primero busca en el Espacio de nombres App para la ruta correspondiente al nombre del método estático mágico. Factories::models() busca en el directorio app/Models.

Pasando nombre de clase corto

En el siguiente código, si tiene App\Models\UserModel, se devolverá la instancia:

<?php

use Higgs\Config\Factories;

$users = Factories::models('UserModel');

Si no tiene App\Models\UserModel, busca Models\UserModel en todos los espacios de nombres.

La próxima vez que solicite la misma clase en cualquier parte de su código, Factories se asegurará recuperas la instancia como antes:

<?php

use Higgs\Config\Factories;

class SomeOtherClass
{
    public function someFunction()
    {
        $users = Factories::models('UserModel');

        // ...
    }
}
Pasar un nombre de clase corto con subdirectorios

Si desea cargar una clase en subdirectorios, utilice / como separador. El siguiente código carga app/Libraries/Sub/SubLib.php si existe:

use Higgs\Config\Factories;

$lib = Factories::libraries('Sub/SubLib');

Aprobar el nombre de clase completo y calificado

También puede solicitar un nombre de clase completo y calificado:

use Higgs\Config\Factories;

$users = Factories::models('Blog\Models\UserModel');
// Or
$users = Factories::models(\Blog\Models\UserModel::class);

Devuelve la instancia de Blog\Models\UserModel si existe.

Nota

Prior to v7.4.0, when you requested a full qualified classname, si solo tuviera Blog\Models\UserModel, se devolvería la instancia. Pero si tuviera tanto App\Models\UserModel como Blog\Models\UserModel, se devolvería la instancia de App\Models\UserModel.

Si quería obtener Blog\Models\UserModel, necesitaba desactivar el opción preferApp:

use Higgs\Config\Factories;

$users = Factories::models('Blog\Models\UserModel', ['preferApp' => false]);

Funciones de conveniencia

Se han proporcionado dos funciones de acceso directo para Fábricas. Estas funciones están siempre disponibles.

configuración()

El primero es config() que devuelve una nueva instancia de una clase Config. El único parámetro requerido es el nombre de la clase:

<?php

$appConfig = config('App');

// The code above is the same as the code below.
$appConfig = \Higgs\Config\Factories::config('App');

modelo()

La segunda función, model() devuelve una nueva instancia de una clase Modelo. El único parámetro requerido es el nombre de la clase:

<?php

$user = model('UserModel');

// The code above is the same as the code below.
$user = \Higgs\Config\Factories::models('UserModel');

Definición del nombre de clase que se cargará

Nuevo en la versión 4.4.0.

Puede definir un nombre de clase para cargar antes de cargar la clase con el método Fábricas::define():

use Higgs\Config\Factories;

Factories::define('models', 'Myth\Auth\Models\UserModel', 'App\Models\UserModel');

El primer parámetro es un componente. El segundo parámetro es un alias de clase. (el primer parámetro del método estático mágico de Factories) y el tercer parámetro es el verdadero nombre de clase completo que se cargará.

Después de eso, si carga Myth\Auth\Models\UserModel con Factories, el Se devolverá la instancia App\Models\UserModel:

$users = model('Myth\Auth\Models\UserModel');

Parámetros de fábrica

Factories toma como segundo parámetro una matriz de valores de opciones (descritos a continuación). Estas directivas anularán las opciones predeterminadas configuradas para cada componente.

Cualquier parámetro adicional pasado al mismo tiempo se reenviará a la clase. constructor, lo que facilita la configuración de su instancia de clase sobre la marcha. Por ejemplo, digamos su aplicación utiliza una base de datos separada para la autenticación y desea asegurarse de que cualquier intento para acceder a los registros de usuario siempre pase por esa conexión:

<?php

use Higgs\Config\Factories;

$conn  = db_connect('auth');
$users = Factories::models('UserModel', [], $conn);

Ahora, cada vez que se carga el UserModel desde Factories, de hecho devolverá un Instancia de clase que utiliza la conexión de base de datos alternativa.

Opciones de fábricas

Es posible que el comportamiento predeterminado no funcione para todos los componentes. Por ejemplo, diga su componente El nombre y su ruta no se alinean, o necesita limitar las instancias a un determinado tipo de clase. Cada componente requiere un conjunto de opciones para dirigir el descubrimiento y la creación de instancias.

Nota

Since v7.4.0, preferApp works only when you request un nombre de clase sin un espacio de nombres .

Comportamiento de las fábricas

Las opciones se pueden aplicar de una de tres maneras (enumeradas en prioridad ascendente):

  • Una clase de configuración Config\Factory con una propiedad que coincide con el nombre de un componente.

  • El método estático Factories::setOptions().

  • Pasar opciones directamente en el momento de la llamada con un parámetro.

Configuraciones

Para configurar las opciones de componentes predeterminadas, cree nuevos archivos de configuración en app/Config/Factory.php que proporciona opciones como una propiedad de matriz que coincide con el nombre del componente.

Ejemplo: Fábricas de filtros

Por ejemplo, si desea crear Filtros por fábricas, el nombre del componente será filtros. Y si desea asegurarse de que cada filtro sea una instancia de una clase que implemente la FilterInterface de Higgs, Su archivo app/Config/Factory.php podría verse así:

<?php

namespace Config;

use Higgs\Config\Factory as BaseFactory;
use Higgs\Filters\FilterInterface;

class Factory extends BaseFactory
{
    public $filters = [
        'instanceOf' => FilterInterface::class,
    ];
}

Ahora puedes crear un filtro con código como Factories::filters('SomeFilter'), y la instancia devuelta seguramente será un filtro de Higgs.

Esto evitaría el conflicto de un módulo de terceros que tuviera un ruta de Filtros no relacionada en su espacio de nombres.

Ejemplo: fábricas de bibliotecas

Si desea cargar las clases de su biblioteca en el directorio app/Libraries con Factories::library('SomeLib'), la ruta Bibliotecas es diferente de la ruta predeterminada Biblioteca.

En este caso, su archivo app/Config/Factory.php tendrá este aspecto:

<?php

namespace Config;

use Higgs\Config\Factory as BaseFactory;

class Factory extends BaseFactory
{
    public $library = [
        'path' => 'Libraries',
    ];
}

Ahora puedes cargar tus bibliotecas con el método Factories::library():

use Higgs\Config\Factories;

$someLib = Factories::library('SomeLib');

Método setOptions

La clase Factories tiene un método estático para permitir la configuración de opciones de tiempo de ejecución: simplemente proporcione la variedad deseada de opciones usando el método setOptions() y serán fusionado con los valores predeterminados y almacenado para la siguiente llamada:

<?php

use Higgs\Config\Factories;
use Higgs\Filters\FilterInterface;

Factories::setOptions('filters', [
    'instanceOf' => FilterInterface::class,
    'prefersApp' => false,
]);

Opciones de parámetros

La llamada mágica estática de Factories toma como segundo parámetro una matriz de valores de opciones. Estas directivas anularán las opciones almacenadas configuradas para cada componente y se pueden Se utiliza en el momento de la llamada para obtener exactamente lo que necesita. La entrada debe ser una matriz con opción. nombres como claves para cada valor primordial.

Por ejemplo, de forma predeterminada Factories supone que desea ubicar una instancia compartida de un componente. Al agregar un segundo parámetro a la llamada estática mágica, puede controlar si esa única llamada devolverá una instancia nueva o compartida:

use Higgs\Config\Factories;

$users = Factories::models('UserModel', ['getShared' => true]);  // Default; will always be the same instance
$other = Factories::models('UserModel', ['getShared' => false]); // Will always create a new instance

Configuración de almacenamiento en caché

Nuevo en la versión 4.4.0.

Para mejorar el rendimiento, se ha implementado Config Caching.

Requisito previo

Importante

Using this feature when the prerequisites are not met will prevent Higgs funcione correctamente. No utilice esta función en tales casos.

  • Para utilizar esta característica, las propiedades de todos los objetos de configuración instanciados en Las fábricas no se deben modificar después de la creación de instancias. Dicho de otra manera, la configuración las clases deben ser clases inmutables o de solo lectura.

  • De forma predeterminada, cada clase de configuración que se almacena en caché debe implementar __set_state() método.

Cómo funciona

  • Guarde todas las instancias de configuración en las fábricas en un archivo de caché antes del apagado. si cambia el estado de las instancias de configuración en las fábricas.

  • Restaurar instancias de configuración almacenadas en caché antes de la inicialización de Higgs si es un caché está disponible.

En pocas palabras, todas las instancias de configuración mantenidas por las fábricas se almacenan en caché inmediatamente antes. para apagarse y las instancias almacenadas en caché se utilizan de forma permanente.

Cómo actualizar los valores de configuración

Una vez almacenadas, las versiones almacenadas en caché nunca caducan. Cambiar un archivo de configuración existente (o cambiar las variables de entorno) no actualizará el caché ni la configuración valores.

Entonces, si desea actualizar los valores de configuración, actualice los archivos de configuración o las variables de entorno. para ellos y deberá eliminar manualmente el archivo de caché.

Puedes usar el comando spark cache:clear:

caché de chispa de php: borrar

O simplemente elimine el archivo writable/cache/FactoriesCache_config.

Cómo habilitar el almacenamiento en caché de configuración

Descomente el siguiente código en public/index.php:

--- a/public/index.php
+++ b/public/index.php
@@ -49,8 +49,8 @@ if (! definido('MEDIOAMBIENTE')) {
 }

 // Cargar caché de configuración
-// $factoriesCache = nuevo \Higgs\Cache\FactoriesCache();
-// $factoriesCache->load('config');
+$factoriesCache = nuevo \Higgs\Cache\FactoriesCache();
+$factoriesCache->load('config');
 // ^^^ Descomente estas líneas si desea utilizar Config Caching.

 /*
@@ -79,7 +79,7 @@ $aplicación->setContext($contexto);
 $aplicación->ejecutar();

 // Guardar caché de configuración
-// $factoriesCache->save('config');
+$factoriesCache->save('config');
 // ^^^ Descomente esta línea si desea utilizar Config Caching.

 // Sale de la aplicación y configura el código de salida para aplicaciones basadas en CLI