Cada marco utiliza archivos de configuración para definir numerosos parámetros y configuraciones iniciales. Así mismo, los archivos de configuración de CodeIgniter definen clases simples donde las configuraciones requeridas son propiedades públicas.

A diferencia de muchos otros marcos, los elementos configurables de CodeIgniter no están contenidos en un solo archivo. En su defecto, cada clase que necesite elementos configurables tendrá un archivo de configuración con el mismo nombre que la clase que lo usa. De este modo, encontrará los archivos de configuración de la aplicación en la carpeta app/Config.

Trabajar con archivos de configuración de CodeIgniter

Por su parte, puede acceder a los archivos de configuración para sus clases de varias maneras diferentes.

Entonces, al usar la palabra clave para crear una instancia:

<?php

// Creating new configuration object by hand
$config = new \Config\Pager();

Usando la función:

<?php

// Get shared instance with config function
$config = config('Pager');

// Access config class with namespace
$config = config('Config\\Pager');
$config = config(\Config\Pager::class);

// Creating a new object with config function
$config = config('Pager', false);

Como se puede apreciar, todas las propiedades del objeto de configuración son públicas. Por lo tanto, accede a la configuración como cualquier otra propiedad:

<?php

$config = config('Pager');
// Access settings as object properties
$pageSize = $config->perPage;

Si no se proporciona ningún espacio de nombres, buscará el archivo en todos los espacios de nombres definidos, así como en app/Config/.

Todos los archivos de configuración que se envían con CodeIgniter tienen espacios de nombres con Config. Por consiguiente, el uso de este espacio de nombres en su aplicación proporcionará el mejor rendimiento, ya que sabe exactamente dónde encontrar los archivos.

Asimismo, puede colocar los archivos de configuración en cualquier carpeta que desee utilizando un espacio de nombres diferente. Esto le permite colocar los archivos de configuración en el servidor de producción en una carpeta a la que no se puede acceder desde la web mientras se mantiene en /app para facilitar el acceso durante el desarrollo.

Creación de archivos de configuración

Cuando necesite una nueva configuración, primero cree un nuevo archivo en la ubicación deseada. La ubicación de archivo predeterminada (recomendada para la mayoría de los casos) es app/Config. La clase debe usar el espacio de nombres apropiado y debe extenderse CodeIgniter\Config\BaseConfigpara garantizar que pueda recibir configuraciones específicas del entorno.

Defina la clase y llénela con propiedades públicas que representen su configuración:

<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;

class CustomClass extends BaseConfig
{
public $siteName = 'My Great Site';
public $siteEmail = 'webmaster@example.com';
// ...
}

Variables de entorno

Una de las mejores prácticas actuales para la configuración de aplicaciones es usar variables de entorno. Una de las razones de esto es que las variables de entorno son fáciles de cambiar entre implementaciones sin cambiar ningún código. La configuración puede cambiar mucho en las implementaciones, pero el código no. Por ejemplo, varios entornos, como la máquina local del desarrollador y el servidor de producción, normalmente necesitan valores de configuración diferentes para cada instalación en particular.

Las variables de entorno también deben usarse para cualquier cosa privada, como contraseñas, claves de API u otros datos confidenciales.

Variables de entorno y CodeIgniter

CodeIgniter hace que sea simple e indoloro establecer variables de entorno mediante el uso de un archivo “dotenv“. El término proviene del nombre del archivo, que comienza con un punto antes del texto “env“.

CodeIgniter espera que .env esté en la raíz de su proyecto junto con los app directorios. Hay un archivo de plantilla distribuido con CodeIgniter que se encuentra en la raíz del proyecto llamado env (¿Notó que no hay un punto ( . ) al principio?). Tiene una gran colección de variables que su proyecto podría usar a las que se les han asignado valores vacíos, ficticios o predeterminados. Puede utilizar este archivo como punto de partida para su aplicación cambiando el nombre de la plantilla a .env o haciendo una copia con el nombre .env .

La configuración se almacena en archivos .env como una simple colección de pares de nombre / valor separados por un signo igual.
S3_BUCKET = dotenv
SECRET_KEY = super_secret_key
CI_ENVIRONMENT = development

Cuando se ejecute su aplicación, .env se cargará automáticamente y las variables se colocarán en el entorno. Si una variable ya existe en el entorno, NO se sobrescribirá. Se accede a las variables de entorno cargadas utilizando cualquiera de los siguientes: getenv(), $_SERVER o $_ENV.

<?php

$s3_bucket = getenv('S3_BUCKET');
$s3_bucket = $_ENV['S3_BUCKET'];
$s3_bucket = $_SERVER['S3_BUCKET'];

Variables de anidamiento

Para ahorrar en escribir, puede reutilizar las variables que ya ha especificado en el archivo ajustando el nombre de la variable dentro de ${…}:
BASE_DIR="/var/webroot/project-root"
CACHE_DIR="${BASE_DIR}/cache"
TMP_DIR="${BASE_DIR}/tmp"

Variables con espacio de nombres

Habrá momentos en los que tendrá varias variables con el mismo nombre. El sistema necesita una forma de saber cuál debe ser la configuración correcta. Este problema se resuelve ” espaciando nombres ” de las variables.

Las variables con espacio de nombres utilizan una notación de puntos para calificar los nombres de las variables, de modo que sean únicos cuando se incorporen al entorno. Esto se hace incluyendo un prefijo distintivo seguido de un punto (.) y luego el nombre de la variable en sí.
// not namespaced variables
name = "George"
db=my_db

// namespaced variables
address.city = “Berlin”
address.country = “Germany”
frontend.db = sales
backend.db = admin
BackEnd.db = admin

Separador de espacio de nombres

Algunos entornos, por ejemplo, Docker, CloudFormation, no permiten nombres de variables con puntos (.). En tal caso, desde v4.1.5, también puede usar guiones bajos (_) como separador.

// namespaced variables with underscore
app_forceGlobalSecureRequests = true
app_CSPEnabled = true

Clases de configuración y variables de entorno

Cuando crea una instancia de una clase de configuración, cualquier variable de entorno con espacio de nombres se considera para fusionarse con las propiedades del objeto de configuración.

Si el prefijo de una variable de espacio de nombres coincide exactamente con el espacio de nombres de la clase de configuración, la parte final de la configuración (después del punto) se trata como una propiedad de configuración. En caso de coincidir con una propiedad de configuración existente, el valor de la variable de entorno reemplazará el valor correspondiente del archivo de configuración.

Si no hay ninguna coincidencia, las propiedades de la clase de configuración no se modifican. En este uso, el prefijo debe ser el espacio de nombres completo (sensible a mayúsculas y minúsculas) de la clase.

Config\App.forceGlobalSecureRequests = true
Config\App.CSPEnabled = true

Lo mismo se aplica a un prefijo corto, que es un espacio de nombres que usa solo la versión en minúsculas del nombre de la clase de configuración. Si el prefijo corto coincide con el nombre de la clase, el valor de .env reemplaza el valor del archivo de configuración.

app.forceGlobalSecureRequests = true
app.CSPEnabled = true

Desde v4.1.5, también puede escribir con guiones bajos:

app_forceGlobalSecureRequests = true
app_CSPEnabled = true

Variables de entorno como reemplazos de datos

Es muy importante recordar siempre que las variables de entorno contenidas en su .env son solo reemplazos de los datos existentes. Esto significa que no puede esperar llenar su .env con todos los reemplazos para sus configuraciones, pero no tiene nada para recibir estos reemplazos en los archivos de configuración relacionados.

El .env solo sirve para completar o reemplazar los valores en sus archivos de configuración. Dicho esto, sus archivos de configuración deben tener un contenedor o una propiedad de recepción para ellos. Agregar tantas variables en su .env sin nada que las contenga en el extremo receptor es inútil.

En pocas palabras, no puede simplemente poner su .env y esperar que mágicamente tenga esa propiedad y valor en tiempo de ejecución. app.myNewConfig = foo Config\App

Tratamiento de variables de entorno como matrices

Una variable de entorno con espacio de nombres se puede tratar como una matriz. Si el prefijo coincide con la clase de configuración, el resto del nombre de la variable de entorno se trata como una referencia de matriz si también contiene un punto.

// regular namespaced variable
Config\SimpleConfig.name = George

// array namespaced variables
Config\SimpleConfig.address.city = “Berlin”
Config\SimpleConfig.address.country = “Germany”

Si esto se refiriera a un objeto de configuración SimpleConfig, el ejemplo anterior se trataría como:

<?php

$address['city'] = 'Berlin';
$address['country'] = 'Germany';

Cualquier otro elemento de la $address propiedad no cambiaría.

También puede usar el nombre de propiedad de la matriz como prefijo. Si el archivo de entorno contuviera lo siguiente, el resultado sería el mismo que el anterior.

// array namespaced variables
Config\SimpleConfig.address.city = "Berlin"
address.country = "Germany"

Manejo de diferentes entornos

La configuración de varios entornos se logra fácilmente mediante el uso de un archivo .env independiente con valores modificados para satisfacer las necesidades de ese entorno.

El archivo no debe contener todas las configuraciones posibles para cada clase de configuración utilizada por la aplicación. En verdad, debe incluir solo aquellos elementos que son específicos del entorno o son detalles confidenciales como contraseñas y claves de API y otra información que no debe exponerse. Pero cualquier cosa que cambie entre implementaciones es un juego justo.

En cada entorno, coloque el archivo .env en la carpeta raíz del proyecto. Para la mayoría de las configuraciones, este será el mismo nivel que los directorios.

No realice un seguimiento de los archivos .env con su sistema de control de versiones. Si lo hace, y el repositorio se hace público, habrá puesto información confidencial donde todos puedan encontrarla.

Registradores

Los “registradores” son otras clases que pueden proporcionar propiedades de configuración adicionales. Los registradores proporcionan un medio para modificar una configuración en tiempo de ejecución entre espacios de nombres y archivos. Hay dos formas de implementar un registrador: implícita y explícita.

Registradores implícitos

En este sentido, cualquier espacio de nombres puede definir registradores usando el archivo Config/Registrar.php si el descubrimiento está habilitado en Módulos. Por consiguiente, estos archivos son clases cuyos métodos se nombran para cada clase de configuración que desea ampliar.

Por ejemplo, es posible que un módulo de terceros desee proporcionar una plantilla adicional Pager sin sobrescribir lo que ya haya configurado un desarrollador. En src/Config/Registrar.php habría una Registrar clase con el  método único (tenga en cuenta la distinción entre mayúsculas y minúsculas):

<?php

class Registrar
{
public static function Pager(): array
{
return [
'templates' => [
'module_pager' => 'MyModule\Views\Pager',
],
];
}
}

Los métodos de registro siempre deben devolver una matriz, con claves correspondientes a las propiedades del archivo de configuración de destino. Los valores existentes se fusionan y las propiedades del registrador tienen prioridad de sobrescritura.

Registradores explícitos

Un archivo de configuración también puede especificar cualquier número de registradores de forma explícita. Esto se hace agregando una $registrars propiedad a su archivo de configuración, que contiene una matriz de nombres de registradores candidatos:

<?php

namespace Config;

class MyConfig extends BaseConfig
{
public static $registrars = [
SupportingPackageRegistrar::class,
];

// ...
}

Ahora mismo, para actuar como un “registrador”, las clases así identificadas deben tener una función estática con el mismo nombre que la clase de configuración. (Y debe devolver una matriz asociativa de configuraciones de propiedades).

Cuando se crea una instancia de su objeto de configuración, recorrerá las clases designadas en $registrars. Para cada una de estas clases, invocará el método nombrado para la clase de configuración e incorporará las propiedades devueltas.

Una configuración de clase de configuración de muestra para esto:

<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;

class MySalesConfig extends BaseConfig
{
public $target = 100;
public $campaign = 'Winter Wonderland';
public static $registrars = [
'\App\Models\RegionalSales',
];
}

En el caso del modelo de ventas regional asociado, este podría verse así:

<?php

namespace App\Models;

class RegionalSales
{
public static function MySalesConfig()
{
return [
'target' => 45,
];
}
}

Con el ejemplo anterior, cuando MySalesConfigse crea una instancia, terminará con las tres propiedades declaradas, pero el valor de la propiedad se anulará al tratarse como un “registrador”. Por tanto, las propiedades de configuración resultantes:

<?php

$target = 45;
$campaign = 'Winter Wonderland';

https://aprendeinformaticas.com/

https://codeigniter.com/user_guide/general/configuration.html