Carga variables de entorno de .env
a getenv()
, $_ENV
y $_SERVER
automáticamente.
Nunca debes almacenar credenciales confidenciales en tu código . Almacenar la configuración en el entorno es uno de los principios de una aplicación de doce factores. Cualquier cosa que pueda cambiar entre entornos de implementación, como credenciales de bases de datos o credenciales para servicios de terceros, debe extraerse del código en variables de entorno.
Básicamente, un archivo .env
es una manera fácil de cargar variables de configuración personalizadas que su aplicación necesita sin tener que modificar archivos .htaccess o hosts virtuales Apache/nginx. Esto significa que no tendrá que editar ningún archivo fuera del proyecto y todas las variables de entorno siempre estarán configuradas sin importar cómo ejecute su proyecto: Apache, Nginx, CLI e incluso el servidor web integrado de PHP. Es MUCHO más fácil que todas las otras formas que conoces de configurar variables de entorno, ¡y te encantará!
php_value
a archivos .htaccessPHP dotenv es una versión PHP del Ruby dotenv original.
La instalación es muy sencilla a través de Composer:
$ composer require vlucas/phpdotenv
o agréguelo manualmente a su archivo composer.json
.
Seguimos el control de versiones semántico, lo que significa que pueden ocurrir cambios importantes entre versiones principales. Tenemos guías de actualización disponibles para V2 a V3, V3 a V4 y V4 a V5 disponibles aquí.
El archivo .env
generalmente se mantiene fuera del control de versiones, ya que puede contener claves API y contraseñas confidenciales. Se crea un archivo .env.example
separado con todas las variables de entorno requeridas definidas, excepto las sensibles, que son proporcionadas por el usuario para sus propios entornos de desarrollo o se comunican a otros lugares a los colaboradores del proyecto. Luego, los colaboradores del proyecto copian de forma independiente el archivo .env.example
a un .env
local y se aseguran de que todas las configuraciones sean correctas para su entorno local, completando las claves secretas o proporcionando sus propios valores cuando sea necesario. En este uso, el archivo .env
debe agregarse al archivo .gitignore
del proyecto para que los colaboradores nunca lo confirmen. Este uso garantiza que nunca habrá contraseñas confidenciales o claves API en el historial de control de versiones, por lo que hay menos riesgo de una violación de seguridad y los valores de producción nunca tendrán que compartirse con todos los colaboradores del proyecto.
Agregue la configuración de su aplicación a un archivo .env
en la raíz de su proyecto. Asegúrese de que el archivo .env
esté agregado a su .gitignore
para que no esté registrado en el código
S3_BUCKET= " dotenv "
SECRET_KEY= " souper_seekret_key "
Ahora cree un archivo llamado .env.example
y regístrelo en el proyecto. Esto debería tener las variables ENV que necesita configurar, pero los valores deben estar en blanco o llenos de datos ficticios. La idea es que la gente sepa qué variables se requieren, pero no darles los valores de producción sensibles.
S3_BUCKET= " devbucket "
SECRET_KEY= " abc123 "
Luego puedes cargar .env
en tu aplicación con:
$ dotenv = Dotenv Dotenv :: createImmutable ( __DIR__ );
$ dotenv -> load ();
Para suprimir la excepción que se produce cuando no hay ningún archivo .env
, puede:
$ dotenv = Dotenv Dotenv :: createImmutable ( __DIR__ );
$ dotenv -> safeLoad ();
Opcionalmente, puede pasar un nombre de archivo como segundo parámetro, si desea utilizar algo que no sea .env
:
$ dotenv = Dotenv Dotenv :: createImmutable ( __DIR__ , ' myconfig ' );
$ dotenv -> load ();
Todas las variables definidas ahora están disponibles en los superglobales $_ENV
y $_SERVER
.
$ s3_bucket = $ _ENV [ ' S3_BUCKET ' ];
$ s3_bucket = $ _SERVER [ ' S3_BUCKET ' ];
Se desaconseja encarecidamente el uso de getenv()
y putenv()
debido al hecho de que estas funciones no son seguras para subprocesos; sin embargo, aún es posible indicarle a PHP dotenv que use estas funciones. En lugar de llamar Dotenv::createImmutable
, se puede llamar Dotenv::createUnsafeImmutable
, lo que agregará PutenvAdapter
detrás de escena. Sus variables de entorno ahora estarán disponibles usando el método getenv
, así como las superglobales:
$ s3_bucket = getenv ( ' S3_BUCKET ' );
$ s3_bucket = $ _ENV [ ' S3_BUCKET ' ];
$ s3_bucket = $ _SERVER [ ' S3_BUCKET ' ];
Es posible anidar una variable de entorno dentro de otra, lo que resulta útil para reducir la repetición.
Esto se hace envolviendo una variable de entorno existente en ${…}
por ejemplo
BASE_DIR= " /var/webroot/project-root "
CACHE_DIR= " ${BASE_DIR} /cache "
TMP_DIR= " ${BASE_DIR} /tmp "
La inmutabilidad se refiere a si a Dotenv se le permite sobrescribir las variables de entorno existentes. Si desea que Dotenv sobrescriba las variables de entorno existentes, use createMutable
en lugar de createImmutable
:
$ dotenv = Dotenv Dotenv :: createMutable ( __DIR__ );
$ dotenv -> load ();
Detrás de escena, esto le indica al "repositorio" que permita la inmutabilidad o no. De forma predeterminada, el repositorio está configurado para permitir sobrescribir los valores existentes, lo cual es relevante si uno llama al método "crear" usando RepositoryBuilder
para construir un repositorio más personalizado:
$ repository = Dotenv Repository RepositoryBuilder :: createWithNoAdapters ()
-> addAdapter ( Dotenv Repository Adapter EnvConstAdapter ::class)
-> addWriter ( Dotenv Repository Adapter PutenvAdapter ::class)
-> immutable ()
-> make ();
$ dotenv = Dotenv Dotenv :: create ( $ repository , __DIR__ );
$ dotenv -> load ();
El ejemplo anterior escribirá valores cargados en $_ENV
y putenv
, pero al interpolar variables de entorno, solo leeremos desde $_ENV
. Además, nunca reemplazará ninguna variable ya configurada antes de cargar el archivo.
Por medio de otro ejemplo, también se puede especificar un conjunto de variables que se permitirán enumerar. Es decir, sólo se cargarán las variables de la lista permitida:
$ repository = Dotenv Repository RepositoryBuilder :: createWithDefaultAdapters ()
-> allowList ([ ' FOO ' , ' BAR ' ])
-> make ();
$ dotenv = Dotenv Dotenv :: create ( $ repository , __DIR__ );
$ dotenv -> load ();
PHP dotenv tiene una funcionalidad de validación incorporada, incluso para imponer la presencia de una variable de entorno. Esto es particularmente útil para que las personas conozcan cualquier variable requerida explícita sin la cual su aplicación no funcionará.
Puedes usar una sola cadena:
$ dotenv -> required ( ' DATABASE_DSN ' );
O una serie de cadenas:
$ dotenv -> required ([ ' DB_HOST ' , ' DB_NAME ' , ' DB_USER ' , ' DB_PASS ' ]);
Si falta alguna variable ENV, Dotenv generará una RuntimeException
como esta:
One or more environment variables failed assertions: DATABASE_DSN is missing
Más allá de simplemente requerir que se establezca una variable, es posible que también deba asegurarse de que la variable no esté vacía:
$ dotenv -> required ( ' DATABASE_DSN ' )-> notEmpty ();
Si la variable de entorno está vacía, obtendrá una excepción:
One or more environment variables failed assertions: DATABASE_DSN is empty
Es posible que también deba asegurarse de que la variable tenga un valor entero. Puedes hacer lo siguiente:
$ dotenv -> required ( ' FOO ' )-> isInteger ();
Si la variable de entorno no es un número entero, obtendrá una excepción:
One or more environment variables failed assertions: FOO is not an integer.
Es posible que uno solo desee aplicar reglas de validación cuando se establece una variable. Nosotros también apoyamos esto:
$ dotenv -> ifPresent ( ' FOO ' )-> isInteger ();
Es posible que deba asegurarse de que una variable tenga formato booleano, aceptando "verdadero", "falso", "Activado", "1", "Sí", "Desactivado", "0" y "No". Puedes hacer lo siguiente:
$ dotenv -> required ( ' FOO ' )-> isBoolean ();
Si la variable de entorno no es booleana, obtendrá una excepción:
One or more environment variables failed assertions: FOO is not a boolean.
De manera similar, se puede escribir:
$ dotenv -> ifPresent ( ' FOO ' )-> isBoolean ();
También es posible definir un conjunto de valores que debería tener su variable de entorno. Esto es especialmente útil en situaciones en las que su código solo admite un puñado de opciones o controladores:
$ dotenv -> required ( ' SESSION_STORE ' )-> allowedValues ([ ' Filesystem ' , ' Memcached ' ]);
Si la variable de entorno no estuviera en esta lista de valores permitidos, obtendría una excepción similar:
One or more environment variables failed assertions: SESSION_STORE is not an allowed value.
También es posible definir una expresión regular que debería ser su variable de entorno.
$ dotenv -> required ( ' FOO ' )-> allowedRegexValues ( ' ([[:lower:]]{3}) ' );
Puede comentar su archivo .env
usando el carácter #
. P.ej
# this is a comment
VAR= " value " # comment
VAR=value # comment
A veces, simplemente desea analizar el archivo y resolver las variables de entorno anidadas, brindándonos una cadena y que le devuelvan una matriz. Si bien esto ya es posible, es un poco complicado, por lo que proporcionamos una forma directa de hacerlo:
// ['FOO' => 'Bar', 'BAZ' => 'Hello Bar']
Dotenv Dotenv :: parse ( " FOO=Bar n BAZ= " Hello $ {FOO} "" );
Esto es exactamente lo mismo que:
Dotenv Dotenv :: createArrayBacked ( __DIR__ )-> load ();
Sólo que, en lugar de proporcionar el directorio para encontrar el archivo, ha proporcionado directamente el contenido del archivo.
Cuando un nuevo desarrollador clona su código base, tendrá un paso único adicional para copiar manualmente el archivo .env.example
a .env
y completar sus propios valores (u obtener cualquier valor confidencial de un compañero de trabajo del proyecto).
En ciertas configuraciones de servidor (que se encuentran más comúnmente en alojamiento compartido), PHP puede desactivar superglobales como $_ENV
o $_SERVER
. Si estas variables no están configuradas, revise variables_order
en el archivo php.ini
. Consulte php.net/manual/en/ini.core.php#ini.variables-order.
Si descubre una vulnerabilidad de seguridad dentro de este paquete, envíe un correo electrónico a [email protected]. Todas las vulnerabilidades de seguridad se abordarán de inmediato. Puede ver nuestra política de seguridad completa aquí.
PHP dotenv tiene la licencia BSD de 3 cláusulas.
Disponible como parte de la suscripción a Tidelift
Los mantenedores de vlucas/phpdotenv
y miles de otros paquetes están trabajando con Tidelift para brindar soporte comercial y mantenimiento para las dependencias de código abierto que utiliza para crear sus aplicaciones. Ahorre tiempo, reduzca el riesgo y mejore la salud del código, mientras paga a los mantenedores de las dependencias exactas que utiliza. Obtenga más información.