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