diff --git a/cli-script.php b/cli-script.php index 5a1d9b737..e3b2ac16a 100755 --- a/cli-script.php +++ b/cli-script.php @@ -82,23 +82,20 @@ $_SESSION = null; // Connect to database if(!isset($databaseConfig) || !isset($databaseConfig['database']) || !$databaseConfig['database']) { echo "\nPlease configure your database connection details. You can do this by creating a file -called _ss_environment.php in either of the following locations:\n\n"; - echo " - " . BASE_PATH . DIRECTORY_SEPARATOR . "_ss_environment.php\n - "; - echo dirname(BASE_PATH) . DIRECTORY_SEPARATOR . "_ss_environment.php\n\n"; +called .env in " . BASE_PATH; echo <<'); -define('SS_DATABASE_PASSWORD', ''); -define('SS_DATABASE_NAME', ''); +SS_DATABASE_SERVER="localhost" +SS_DATABASE_USERNAME="" +SS_DATABASE_PASSWORD="" +SS_DATABASE_NAME="" -------------------------------------------------- Once you have done that, run 'composer install' or './framework/sake dev/build' to create diff --git a/composer.json b/composer.json index 185e092cd..dc47dfea3 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,8 @@ "embed/embed": "^2.6", "swiftmailer/swiftmailer": "~5.4", "symfony/config": "^2.8|^3", - "symfony/translation": "^2.8|^3" + "symfony/translation": "^2.8|^3", + "vlucas/phpdotenv": "^2.4" }, "require-dev": { "phpunit/PHPUnit": "~4.8", diff --git a/main.php b/main.php index cc6576478..c1b121b11 100644 --- a/main.php +++ b/main.php @@ -32,8 +32,7 @@ if (version_compare(phpversion(), '5.5.0', '<')) { * * The main.php does a number of set-up activities for the request. * - * - Includes the first one of the following files that it finds: (root)/_ss_environment.php, - * (root)/../_ss_environment.php, or (root)/../../_ss_environment.php + * - Includes the .env file in your webroot * - Gets an up-to-date manifest from {@link ManifestBuilder} * - Sets up error handlers with {@link Debug::loadErrorHandlers()} * - Calls {@link DB::connect()}, passing it the global variable $databaseConfig that should diff --git a/src/Assets/Flysystem/ProtectedAssetAdapter.php b/src/Assets/Flysystem/ProtectedAssetAdapter.php index 5ed034a0f..7a47ff759 100644 --- a/src/Assets/Flysystem/ProtectedAssetAdapter.php +++ b/src/Assets/Flysystem/ProtectedAssetAdapter.php @@ -35,13 +35,8 @@ class ProtectedAssetAdapter extends AssetAdapter implements ProtectedAdapter return parent::findRoot($root); } - // Use environment defined path - if (defined('SS_PROTECTED_ASSETS_PATH')) { - return SS_PROTECTED_ASSETS_PATH; - } - - // Default location is under assets - return ASSETS_PATH . '/' . Config::inst()->get(get_class($this), 'secure_folder'); + // Use environment defined path or default location is under assets + return getenv('SS_PROTECTED_ASSETS_PATH') ?: ASSETS_PATH . '/' . Config::inst()->get(get_class($this), 'secure_folder'); } /** diff --git a/src/Control/Director.php b/src/Control/Director.php index 8ab5863b7..b9c6e0366 100644 --- a/src/Control/Director.php +++ b/src/Control/Director.php @@ -607,7 +607,7 @@ class Director implements TemplateGlobalProvider // See https://support.microsoft.com/en-us/kb/307347 $headerOverride = false; if (TRUSTED_PROXY) { - $headers = (defined('SS_TRUSTED_PROXY_PROTOCOL_HEADER')) ? array(SS_TRUSTED_PROXY_PROTOCOL_HEADER) : null; + $headers = (getenv('SS_TRUSTED_PROXY_PROTOCOL_HEADER')) ? array(getenv('SS_TRUSTED_PROXY_PROTOCOL_HEADER')) : null; if (!$headers) { // Backwards compatible defaults $headers = array('HTTP_X_FORWARDED_PROTO', 'HTTP_X_FORWARDED_PROTOCOL', 'HTTP_FRONT_END_HTTPS'); diff --git a/src/Control/HTTPRequest.php b/src/Control/HTTPRequest.php index b91eb3fc3..b3b7d76f6 100644 --- a/src/Control/HTTPRequest.php +++ b/src/Control/HTTPRequest.php @@ -768,7 +768,7 @@ class HTTPRequest implements ArrayAccess { $headerOverrideIP = null; if (TRUSTED_PROXY) { - $headers = (defined('SS_TRUSTED_PROXY_IP_HEADER')) ? array(SS_TRUSTED_PROXY_IP_HEADER) : null; + $headers = (getenv('SS_TRUSTED_PROXY_IP_HEADER')) ? array(getenv('SS_TRUSTED_PROXY_IP_HEADER')) : null; if (!$headers) { // Backwards compatible defaults $headers = array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR'); diff --git a/src/Core/Constants.php b/src/Core/Constants.php index bc5789a8d..fb1188815 100644 --- a/src/Core/Constants.php +++ b/src/Core/Constants.php @@ -3,7 +3,6 @@ * This file is the Framework constants bootstrap. It will prepare some basic common constants. * * It takes care of: - * - Including _ss_environment.php * - Normalisation of $_SERVER values * - Initialisation of necessary constants (mostly paths) * @@ -30,48 +29,6 @@ /////////////////////////////////////////////////////////////////////////////// // ENVIRONMENT CONFIG -/** - * Include _ss_environment.php file - */ -//define the name of the environment file -$envFile = '_ss_environment.php'; -//define the dirs to start scanning from (have to add the trailing slash) -// we're going to check the realpath AND the path as the script sees it -$dirsToCheck = array( - realpath('.'), - dirname($_SERVER['SCRIPT_FILENAME']) -); -//if they are the same, remove one of them -if ($dirsToCheck[0] == $dirsToCheck[1]) { - unset($dirsToCheck[1]); -} -foreach ($dirsToCheck as $dir) { - //check this dir and every parent dir (until we hit the base of the drive) - // or until we hit a dir we can't read - while (true) { - //if it's readable, go ahead - if (@is_readable($dir)) { - //if the file exists, then we include it, set relevant vars and break out - if (file_exists($dir . DIRECTORY_SEPARATOR . $envFile)) { - define('SS_ENVIRONMENT_FILE', $dir . DIRECTORY_SEPARATOR . $envFile); - include_once(SS_ENVIRONMENT_FILE); - //break out of BOTH loops because we found the $envFile - break(2); - } - } else { - //break out of the while loop, we can't read the dir - break; - } - if (dirname($dir) == $dir) { - // here we need to check that the path of the last dir and the next one are - // not the same, if they are, we have hit the root of the drive - break; - } - //go up a directory - $dir = dirname($dir); - } -} - /** * Validate whether the request comes directly from a trusted server or not * This is necessary to validate whether or not the values of X-Forwarded- @@ -82,18 +39,18 @@ if (!defined('TRUSTED_PROXY')) { if (getenv('BlockUntrustedProxyHeaders') // Legacy setting (reverted from documentation) || getenv('BlockUntrustedIPs') // Documented setting - || defined('SS_TRUSTED_PROXY_IPS') + || getenv('SS_TRUSTED_PROXY_IPS') ) { $trusted = false; - if (defined('SS_TRUSTED_PROXY_IPS') && SS_TRUSTED_PROXY_IPS !== 'none') { - if (SS_TRUSTED_PROXY_IPS === '*') { + if (getenv('SS_TRUSTED_PROXY_IPS') !== 'none') { + if (getenv('SS_TRUSTED_PROXY_IPS') === '*') { $trusted = true; } elseif (isset($_SERVER['REMOTE_ADDR'])) { if (!class_exists('SilverStripe\\Control\\Util\\IPUtils')) { require_once 'Control/IPUtils.php'; }; - $trusted = SilverStripe\Control\Util\IPUtils::checkIP($_SERVER['REMOTE_ADDR'], explode(',', SS_TRUSTED_PROXY_IPS)); + $trusted = SilverStripe\Control\Util\IPUtils::checkIP($_SERVER['REMOTE_ADDR'], explode(',', getenv('SS_TRUSTED_PROXY_IPS'))); } } } @@ -202,6 +159,23 @@ if (!defined('BASE_PATH')) { } define('BASE_PATH', $candidateBasePath); } + +// Allow a first class env var to be set that disables .env file loading +if (!getenv('SS_IGNORE_DOT_ENV')) { + foreach (array( + BASE_PATH, + dirname(BASE_PATH), + ) as $path) { + try { + (new \Dotenv\Dotenv($path))->load(); + } catch (\Dotenv\Exception\InvalidPathException $e) { + // no .env found - no big deal + continue; + } + break; + } +} + if (!defined('BASE_URL')) { // Determine the base URL by comparing SCRIPT_NAME to SCRIPT_FILENAME and getting common elements $path = realpath($_SERVER['SCRIPT_FILENAME']); diff --git a/src/Core/Manifest/ClassManifest.php b/src/Core/Manifest/ClassManifest.php index 4c2854995..51a689791 100644 --- a/src/Core/Manifest/ClassManifest.php +++ b/src/Core/Manifest/ClassManifest.php @@ -176,7 +176,7 @@ class ClassManifest $this->base = $base; $this->tests = $includeTests; - $cacheClass = defined('SS_MANIFESTCACHE') ? SS_MANIFESTCACHE : 'SilverStripe\\Core\\Manifest\\ManifestCache_File'; + $cacheClass = getenv('SS_MANIFESTCACHE') ?: 'SilverStripe\\Core\\Manifest\\ManifestCache_File'; $this->cache = new $cacheClass('classmanifest'.($includeTests ? '_tests' : '')); $this->cacheKey = 'manifest'; diff --git a/src/Core/Manifest/ConfigManifest.php b/src/Core/Manifest/ConfigManifest.php index b5f1c1aaa..48a4f09ab 100644 --- a/src/Core/Manifest/ConfigManifest.php +++ b/src/Core/Manifest/ConfigManifest.php @@ -210,7 +210,7 @@ class ConfigManifest if (isset($key['envvars'])) { foreach ($key['envvars'] as $variable => $foo) { - $key['envvars'][$variable] = isset($_ENV[$variable]) ? $_ENV[$variable] : null; + $key['envvars'][$variable] = getenv($variable) ?: null; } } @@ -726,7 +726,7 @@ class ConfigManifest break; case 'envvarset': - $matches = $matches && isset($_ENV[$v]); + $matches = $matches && getenv($v); break; case 'constantdefined': @@ -735,7 +735,7 @@ class ConfigManifest default: $matches = $matches && ( - (isset($_ENV[$k]) && $_ENV[$k] == $v) || + getenv($k) == $v || (defined($k) && constant($k) == $v) ); break; diff --git a/src/Core/Startup/ParameterConfirmationToken.php b/src/Core/Startup/ParameterConfirmationToken.php index 0e4076320..b9075614a 100644 --- a/src/Core/Startup/ParameterConfirmationToken.php +++ b/src/Core/Startup/ParameterConfirmationToken.php @@ -179,7 +179,7 @@ class ParameterConfirmationToken // See https://support.microsoft.com/en-us/kb/307347 $headerOverride = false; if (TRUSTED_PROXY) { - $headers = (defined('SS_TRUSTED_PROXY_PROTOCOL_HEADER')) ? array(SS_TRUSTED_PROXY_PROTOCOL_HEADER) : null; + $headers = (getenv('SS_TRUSTED_PROXY_PROTOCOL_HEADER')) ? array(getenv('SS_TRUSTED_PROXY_PROTOCOL_HEADER')) : null; if (!$headers) { // Backwards compatible defaults $headers = array('HTTP_X_FORWARDED_PROTO', 'HTTP_X_FORWARDED_PROTOCOL', 'HTTP_FRONT_END_HTTPS'); diff --git a/src/Dev/Deprecation.php b/src/Dev/Deprecation.php index d7de927ee..6af497ced 100644 --- a/src/Dev/Deprecation.php +++ b/src/Dev/Deprecation.php @@ -152,10 +152,7 @@ class Deprecation if (isset(self::$enabled)) { return self::$enabled; } - if (defined('SS_DEPRECATION_ENABLED')) { - return SS_DEPRECATION_ENABLED; - } - return true; + return getenv('SS_DEPRECATION_ENABLED') ?: true; } /** diff --git a/src/Dev/Install/client/dist/js/install.js b/src/Dev/Install/client/dist/js/install.js index d347f281c..2bd164d0e 100644 --- a/src/Dev/Install/client/dist/js/install.js +++ b/src/Dev/Install/client/dist/js/install.js @@ -2,7 +2,7 @@ $(document).ready(function () { /** * Toggle field readonly modes, if check configuration comes from - * _ss_environment (values populated on reload). + * environment variables (values populated on reload). */ $('#use_environment').click(function (e) { if (!$(this).is(':checked')) { diff --git a/src/Dev/Install/config-form.html b/src/Dev/Install/config-form.html index dbf514c25..0e64707f0 100644 --- a/src/Dev/Install/config-form.html +++ b/src/Dev/Install/config-form.html @@ -101,7 +101,7 @@ // All are disabled by default when environment is used $disabled = 'disabled="disabled"'; // If SS_DATABASE_CLASS is specified, check the database in the list - if(defined('SS_DATABASE_CLASS') && SS_DATABASE_CLASS == $class) { + if(getenv('SS_DATABASE_CLASS') == $class) { $checked = ' checked="checked"'; } } else { @@ -135,8 +135,8 @@ $fieldType = ($fieldName == 'password') ? 'password' : 'text'; // values $defaultValue = (isset($fieldSpec['default'])) ? $fieldSpec['default'] : null; - if($usingEnv && isset($fieldSpec['envVar']) && defined($fieldSpec['envVar'])) { - $value = constant($fieldSpec['envVar']); + if($usingEnv && isset($fieldSpec['envVar']) && $envVar = getenv($fieldSpec['envVar'])) { + $value = $envVar; } else { $value = (isset($databaseConfig[$fieldName]) && $databaseConfig['type'] == $class) ? $databaseConfig[$fieldName] : $defaultValue; } @@ -149,7 +149,7 @@ 'name' => "db[$class][$fieldName]", 'value' => $value, ); - if($usingEnv && isset($fieldSpec['envVar']) && defined($fieldSpec['envVar'])) { + if($usingEnv && isset($fieldSpec['envVar']) && getenv($fieldSpec['envVar'])) { $attrs['disabled'] = 'disabled'; } if(isset($fieldSpec['envVar'])) { @@ -177,7 +177,7 @@
> - +
@@ -202,14 +202,14 @@
- > + >
- > + >
diff --git a/src/Dev/Install/install.php5 b/src/Dev/Install/install.php5 index 22fe22bf1..848eee34c 100755 --- a/src/Dev/Install/install.php5 +++ b/src/Dev/Install/install.php5 @@ -60,8 +60,7 @@ if (!$included) { exit(1); } -$envFileExists = defined('SS_ENVIRONMENT_FILE'); -$usingEnv = $envFileExists && !empty($_REQUEST['useEnv']); +$usingEnv = !empty($_REQUEST['useEnv']); require_once __DIR__ . '/DatabaseConfigurationHelper.php'; require_once __DIR__ . '/DatabaseAdapterRegistry.php'; @@ -142,8 +141,8 @@ if(isset($_REQUEST['db'])) { if(isset($_REQUEST['db']['type'])) { $type = $_REQUEST['db']['type']; } else { - if( defined('SS_DATABASE_CLASS') ){ - $type = $_REQUEST['db']['type'] = SS_DATABASE_CLASS; + if ($type = getenv('SS_DATABASE_CLASS')) { + $_REQUEST['db']['type'] = $type; } elseif( $databaseClasses['MySQLPDODatabase']['supported'] ) { $type = $_REQUEST['db']['type'] = 'MySQLPDODatabase'; } elseif( $databaseClasses['MySQLDatabase']['supported'] ) { @@ -156,10 +155,10 @@ if(isset($_REQUEST['db'])) { // Disabled inputs don't submit anything - we need to use the environment (except the database name) if($usingEnv) { $_REQUEST['db'][$type] = $databaseConfig = array( - "type" => defined('SS_DATABASE_CLASS') ? SS_DATABASE_CLASS : $type, - "server" => defined('SS_DATABASE_SERVER') ? SS_DATABASE_SERVER : "localhost", - "username" => defined('SS_DATABASE_USERNAME') ? SS_DATABASE_USERNAME : "root", - "password" => defined('SS_DATABASE_PASSWORD') ? SS_DATABASE_PASSWORD : "", + "type" => getenv('SS_DATABASE_CLASS') ?: $type, + "server" => getenv('SS_DATABASE_SERVER') ?: "localhost", + "username" => getenv('SS_DATABASE_USERNAME') ?: "root", + "password" => getenv('SS_DATABASE_PASSWORD') ?: "", "database" => $_REQUEST['db'][$type]['database'], ); @@ -169,8 +168,8 @@ if(isset($_REQUEST['db'])) { $databaseConfig['type'] = $type; } } else { - if( defined('SS_DATABASE_CLASS') ){ - $type = $_REQUEST['db']['type'] = SS_DATABASE_CLASS; + if($type = getenv('SS_DATABASE_CLASS')) { + $_REQUEST['db']['type'] = $type; } elseif( $databaseClasses['MySQLPDODatabase']['supported'] ) { $type = $_REQUEST['db']['type'] = 'MySQLPDODatabase'; } elseif( $databaseClasses['MySQLDatabase']['supported'] ) { @@ -180,9 +179,9 @@ if(isset($_REQUEST['db'])) { } $_REQUEST['db'][$type] = $databaseConfig = array( "type" => $type, - "server" => defined('SS_DATABASE_SERVER') ? SS_DATABASE_SERVER : "localhost", - "username" => defined('SS_DATABASE_USERNAME') ? SS_DATABASE_USERNAME : "root", - "password" => defined('SS_DATABASE_PASSWORD') ? SS_DATABASE_PASSWORD : "", + "server" => getenv('SS_DATABASE_SERVER') ?: "localhost", + "username" => getenv('SS_DATABASE_USERNAME') ?: "root", + "password" => getenv('SS_DATABASE_PASSWORD') ?: "", "database" => isset($_SERVER['argv'][2]) ? $_SERVER['argv'][2] : "SS_mysite", ); } @@ -191,16 +190,16 @@ if(isset($_REQUEST['admin'])) { // Disabled inputs don't submit anything - we need to use the environment (except the database name) if($usingEnv) { $_REQUEST['admin'] = $adminConfig = array( - 'username' => defined('SS_DEFAULT_ADMIN_USERNAME') ? SS_DEFAULT_ADMIN_USERNAME : 'admin', - 'password' => defined('SS_DEFAULT_ADMIN_PASSWORD') ? SS_DEFAULT_ADMIN_PASSWORD : '', + 'username' => getenv('SS_DEFAULT_ADMIN_USERNAME') ?: 'admin', + 'password' => getenv('SS_DEFAULT_ADMIN_PASSWORD') ?: '', ); } else { $adminConfig = $_REQUEST['admin']; } } else { $_REQUEST['admin'] = $adminConfig = array( - 'username' => defined('SS_DEFAULT_ADMIN_USERNAME') ? SS_DEFAULT_ADMIN_USERNAME : 'admin', - 'password' => defined('SS_DEFAULT_ADMIN_PASSWORD') ? SS_DEFAULT_ADMIN_PASSWORD : '', + 'username' => getenv('SS_DEFAULT_ADMIN_USERNAME') ?: 'admin', + 'password' => getenv('SS_DEFAULT_ADMIN_PASSWORD') ?: '', ); } @@ -1402,7 +1401,7 @@ class Installer extends InstallRequirements { // Write the config file global $usingEnv; if($usingEnv) { - $this->statusMessage("Setting up 'mysite/_config.php' for use with _ss_environment.php..."); + $this->statusMessage("Setting up 'mysite/_config.php' for use with environment variables..."); $this->writeToFile("mysite/_config.php", <<getSelectedDatabase(), 0, strlen($prefix) + 5) == strtolower(sprintf('%stmpdb', $prefix))); } @@ -1083,7 +1083,7 @@ class SapphireTest extends PHPUnit_Framework_TestCase $databaseConfig['timezone'] = '+0:00'; DB::connect($databaseConfig); $dbConn = DB::get_conn(); - $prefix = defined('SS_DATABASE_PREFIX') ? SS_DATABASE_PREFIX : 'ss_'; + $prefix = getenv('SS_DATABASE_PREFIX') ?: 'ss_'; $dbname = strtolower(sprintf('%stmpdb', $prefix)) . rand(1000000, 9999999); while (!$dbname || $dbConn->databaseExists($dbname)) { $dbname = strtolower(sprintf('%stmpdb', $prefix)) . rand(1000000, 9999999); @@ -1103,7 +1103,7 @@ class SapphireTest extends PHPUnit_Framework_TestCase public static function delete_all_temp_dbs() { - $prefix = defined('SS_DATABASE_PREFIX') ? SS_DATABASE_PREFIX : 'ss_'; + $prefix = getenv('SS_DATABASE_PREFIX') ?: 'ss_'; foreach (DB::get_schema()->databaseList() as $dbName) { if (preg_match(sprintf('/^%stmpdb[0-9]+$/', $prefix), $dbName)) { DB::get_schema()->dropDatabase($dbName); diff --git a/src/ORM/DB.php b/src/ORM/DB.php index ba2c51e4b..fc1b7593f 100644 --- a/src/ORM/DB.php +++ b/src/ORM/DB.php @@ -241,7 +241,7 @@ class DB return false; } - $prefix = defined('SS_DATABASE_PREFIX') ? SS_DATABASE_PREFIX : 'ss_'; + $prefix = getenv('SS_DATABASE_PREFIX') ?: 'ss_'; $pattern = strtolower(sprintf('/^%stmpdb\d{7}$/', $prefix)); return (bool)preg_match($pattern, $name); } diff --git a/src/Security/BasicAuth.php b/src/Security/BasicAuth.php index 2ad56ac34..fb00fdc0e 100644 --- a/src/Security/BasicAuth.php +++ b/src/Security/BasicAuth.php @@ -134,9 +134,9 @@ class BasicAuth * away from prying eyes, but still be able to test the regular log-in features of the site. * * If you are including conf/ConfigureFromEnv.php in your _config.php file, you can also enable - * this feature by adding this line to your _ss_environment.php: + * this feature by adding this line to your .env: * - * define('SS_USE_BASIC_AUTH', true); + * SS_USE_BASIC_AUTH=1 * * @param boolean $protect Set this to false to disable protection. * @param string $code {@link Permission} code that is required from the user. diff --git a/src/View/ThemeManifest.php b/src/View/ThemeManifest.php index 31bc3f547..f577154ab 100644 --- a/src/View/ThemeManifest.php +++ b/src/View/ThemeManifest.php @@ -72,9 +72,8 @@ class ThemeManifest implements ThemeList $this->project = $project; - $cacheClass = defined('SS_MANIFESTCACHE') - ? SS_MANIFESTCACHE - : 'SilverStripe\\Core\\Manifest\\ManifestCache_File'; + $cacheClass = getenv('SS_MANIFESTCACHE') + ?: 'SilverStripe\\Core\\Manifest\\ManifestCache_File'; $this->cache = new $cacheClass('thememanifest'.($includeTests ? '_tests' : '')); $this->cacheKey = $this->getCacheKey(); diff --git a/src/conf/ConfigureFromEnv.php b/src/conf/ConfigureFromEnv.php index f360653c7..71e140a77 100644 --- a/src/conf/ConfigureFromEnv.php +++ b/src/conf/ConfigureFromEnv.php @@ -1,9 +1,9 @@ environment_type = SS_ENVIRONMENT_TYPE; +if ($envType = getenv('SS_ENVIRONMENT_TYPE')) { + Director::config()->environment_type = $envType; } global $database; // No database provided if (!isset($database) || !$database) { - if (defined('SS_DATABASE_NAME')) { - $database = SS_DATABASE_NAME; - } elseif (defined('SS_DATABASE_CHOOSE_NAME') && SS_DATABASE_CHOOSE_NAME) { - $loopCount = (int)SS_DATABASE_CHOOSE_NAME; + if (!($database = getenv('SS_DATABASE_NAME')) && $chooseName = getenv('SS_DATABASE_CHOOSE_NAME')) { + $loopCount = (int)$chooseName; $databaseDir = BASE_PATH; - for ($i=0; $i<$loopCount-1; - $i++) { + for ($i=0; $i<$loopCount-1; $i++) { $databaseDir = dirname($databaseDir); } - $database = "SS_" . basename($databaseDir); + $database = getenv('SS_DATABASE_PREFIX') ?: 'SS_'; + $database .= basename($databaseDir); $database = str_replace('.', '', $database); } } -if (defined('SS_DATABASE_USERNAME') && defined('SS_DATABASE_PASSWORD')) { +if ($dbUser = getenv('SS_DATABASE_USERNAME')) { global $databaseConfig; // Checks if the database global is defined (if present, wraps with prefix and suffix) @@ -105,69 +83,69 @@ if (defined('SS_DATABASE_USERNAME') && defined('SS_DATABASE_PASSWORD')) { if (!$name) { return ''; } else { - return (defined('SS_DATABASE_PREFIX') ? SS_DATABASE_PREFIX : '') + return (getenv('SS_DATABASE_PREFIX') ?: '') . $name - . (defined('SS_DATABASE_SUFFIX') ? SS_DATABASE_SUFFIX : ''); + . (getenv('SS_DATABASE_SUFFIX') ?: ''); } }; /** @skipUpgrade */ $databaseConfig = array( - "type" => defined('SS_DATABASE_CLASS') ? SS_DATABASE_CLASS : 'MySQLDatabase', - "server" => defined('SS_DATABASE_SERVER') ? SS_DATABASE_SERVER : 'localhost', - "username" => SS_DATABASE_USERNAME, - "password" => SS_DATABASE_PASSWORD, + "type" => getenv('SS_DATABASE_CLASS') ?: 'MySQLDatabase', + "server" => getenv('SS_DATABASE_SERVER') ?: 'localhost', + "username" => $dbUser, + "password" => getenv('SS_DATABASE_PASSWORD'), "database" => $databaseNameWrapper($database), ); // Set the port if called for - if (defined('SS_DATABASE_PORT')) { - $databaseConfig['port'] = SS_DATABASE_PORT; + if ($dbPort = getenv('SS_DATABASE_PORT')) { + $databaseConfig['port'] = $dbPort; } // Set the timezone if called for - if (defined('SS_DATABASE_TIMEZONE')) { - $databaseConfig['timezone'] = SS_DATABASE_TIMEZONE; + if ($dbTZ = getenv('SS_DATABASE_TIMEZONE')) { + $databaseConfig['timezone'] = $dbTZ; } // For schema enabled drivers: - if (defined('SS_DATABASE_SCHEMA')) { - $databaseConfig["schema"] = SS_DATABASE_SCHEMA; + if ($dbSchema = getenv('SS_DATABASE_SCHEMA')) { + $databaseConfig["schema"] = $dbSchema; } // For SQlite3 memory databases (mainly for testing purposes) - if (defined('SS_DATABASE_MEMORY')) { - $databaseConfig["memory"] = SS_DATABASE_MEMORY; + if ($dbMemory = getenv('SS_DATABASE_MEMORY')) { + $databaseConfig["memory"] = $dbMemory; } } -if (defined('SS_SEND_ALL_EMAILS_TO')) { - Email::config()->send_all_emails_to = SS_SEND_ALL_EMAILS_TO; +if ($sendAllEmailsTo = getenv('SS_SEND_ALL_EMAILS_TO')) { + Email::config()->send_all_emails_to = $sendAllEmailsTo; } -if (defined('SS_SEND_ALL_EMAILS_FROM')) { - Email::config()->send_all_emails_from = SS_SEND_ALL_EMAILS_FROM; +if ($sendAllEmailsFrom = getenv('SS_SEND_ALL_EMAILS_FROM')) { + Email::config()->send_all_emails_from = $sendAllEmailsFrom; } -if (defined('SS_DEFAULT_ADMIN_USERNAME')) { - if (!defined('SS_DEFAULT_ADMIN_PASSWORD')) { +if ($defaultAdminUser = getenv('SS_DEFAULT_ADMIN_USERNAME')) { + if (!$defaultAdminPass = getenv('SS_DEFAULT_ADMIN_PASSWORD')) { user_error( - "SS_DEFAULT_ADMIN_PASSWORD must be defined in your _ss_environment.php," + "SS_DEFAULT_ADMIN_PASSWORD must be defined in your environment," . "if SS_DEFAULT_ADMIN_USERNAME is defined. See " . "http://doc.silverstripe.org/framework/en/topics/environment-management for more information", E_USER_ERROR ); } else { - Security::setDefaultAdmin(SS_DEFAULT_ADMIN_USERNAME, SS_DEFAULT_ADMIN_PASSWORD); + Security::setDefaultAdmin($defaultAdminUser, $defaultAdminPass); } } -if (defined('SS_USE_BASIC_AUTH') && SS_USE_BASIC_AUTH) { - BasicAuth::config()->entire_site_protected = SS_USE_BASIC_AUTH; +if ($useBasicAuth = getenv('SS_USE_BASIC_AUTH')) { + BasicAuth::config()->entire_site_protected = $useBasicAuth; } -if (defined('SS_ERROR_LOG')) { +if ($errorLog = getenv('SS_ERROR_LOG')) { $logger = Injector::inst()->get('Logger'); if ($logger instanceof Logger) { - $logger->pushHandler(new StreamHandler(BASE_PATH . '/' . SS_ERROR_LOG, Logger::WARNING)); + $logger->pushHandler(new StreamHandler(BASE_PATH . '/' . $errorLog, Logger::WARNING)); } else { user_error("SS_ERROR_LOG setting only works with Monolog, you are using another logger", E_USER_WARNING); } @@ -175,3 +153,24 @@ if (defined('SS_ERROR_LOG')) { // Allow database adapters to handle their own configuration DatabaseAdapterRegistry::autoconfigure(); + +unset( + $envType, + $chooseName, + $loopCount, + $databaseDir, + $i, + $databaseNameWrapper, + $dbUser, + $dbPort, + $dbTZ, + $dbSchema, + $dbMemory, + $sendAllEmailsTo, + $sendAllEmailsFrom, + $defaultAdminUser, + $defaultAdminPass, + $useBasicAuth, + $errorLog, + $logger +); diff --git a/tests/bootstrap/environment.php b/tests/bootstrap/environment.php index 997f5e1a5..eb6abdb60 100644 --- a/tests/bootstrap/environment.php +++ b/tests/bootstrap/environment.php @@ -1,34 +1,37 @@ setEnvironmentVariable('SS_ENVIRONMENT_TYPE', 'dev'); } -if (!defined('SS_DATABASE_CLASS') && !defined('SS_DATABASE_USERNAME')) { +if (!getenv('SS_DATABASE_CLASS') && !getenv('SS_DATABASE_USERNAME')) { // The default settings let us define the database config via environment vars // Database connection, including PDO and legacy ORM support switch (getenv('DB')) { case "PGSQL"; - define('SS_DATABASE_CLASS', getenv('PDO') ? 'PostgrePDODatabase' : 'PostgreSQLDatabase'); - define('SS_DATABASE_USERNAME', 'postgres'); - define('SS_DATABASE_PASSWORD', ''); - break; + $loader->setEnvironmentVariable('SS_DATABASE_CLASS', getenv('PDO') ? 'PostgrePDODatabase' : 'PostgreSQLDatabase'); + $loader->setEnvironmentVariable('SS_DATABASE_USERNAME', 'postgres'); + $loader->setEnvironmentVariable('SS_DATABASE_PASSWORD', ''); + break; case "SQLITE": - define('SS_DATABASE_CLASS', getenv('PDO') ? 'SQLite3PDODatabase' : 'SQLite3Database'); - define('SS_DATABASE_USERNAME', 'root'); - define('SS_DATABASE_PASSWORD', ''); - define('SS_SQLITE_DATABASE_PATH', ':memory:'); + $loader->setEnvironmentVariable('SS_DATABASE_CLASS', getenv('PDO') ? 'SQLite3PDODatabase' : 'SQLite3Database'); + $loader->setEnvironmentVariable('SS_DATABASE_USERNAME', 'root'); + $loader->setEnvironmentVariable('SS_DATABASE_PASSWORD', ''); + $loader->setEnvironmentVariable('SS_SQLITE_DATABASE_PATH', ':memory:'); break; default: - define('SS_DATABASE_CLASS', getenv('PDO') ? 'MySQLPDODatabase' : 'MySQLDatabase'); - define('SS_DATABASE_USERNAME', 'root'); - define('SS_DATABASE_PASSWORD', ''); + $loader->setEnvironmentVariable('SS_DATABASE_CLASS', getenv('PDO') ? 'MySQLPDODatabase' : 'MySQLDatabase'); + $loader->setEnvironmentVariable('SS_DATABASE_USERNAME', 'root'); + $loader->setEnvironmentVariable('SS_DATABASE_PASSWORD', ''); } - define('SS_DATABASE_SERVER', '127.0.0.1'); - define('SS_DATABASE_CHOOSE_NAME', true); + $loader->setEnvironmentVariable('SS_DATABASE_SERVER', '127.0.0.1'); + $loader->setEnvironmentVariable('SS_DATABASE_CHOOSE_NAME', true); } diff --git a/tests/php/Core/Manifest/ConfigManifestTest.php b/tests/php/Core/Manifest/ConfigManifestTest.php index d8d5e6f20..e6e7f5d01 100644 --- a/tests/php/Core/Manifest/ConfigManifestTest.php +++ b/tests/php/Core/Manifest/ConfigManifestTest.php @@ -427,7 +427,9 @@ class ConfigManifestTest extends SapphireTest public function testEnvVarSetRules() { - $_ENV['ENVVARSET_FOO'] = 1; + $loader = new \Dotenv\Loader(null); + + $loader->setEnvironmentVariable('ENVVARSET_FOO', 1); $config = $this->getConfigFixtureValue('EnvVarSet'); $this->assertEquals( @@ -463,7 +465,9 @@ class ConfigManifestTest extends SapphireTest public function testEnvOrConstantMatchesValueRules() { - $_ENV['ENVORCONSTANTMATCHESVALUE_FOO'] = 'Foo'; + $loader = new \Dotenv\Loader(null); + + $loader->setEnvironmentVariable('ENVORCONSTANTMATCHESVALUE_FOO', 'Foo'); define('ENVORCONSTANTMATCHESVALUE_BAR', 'Bar'); $config = $this->getConfigFixtureValue('EnvOrConstantMatchesValue'); @@ -537,7 +541,9 @@ class ConfigManifestTest extends SapphireTest public function testMultipleRules() { - $_ENV['MULTIPLERULES_ENVVARIABLESET'] = 1; + $loader = new \Dotenv\Loader(null); + + $loader->setEnvironmentVariable('MULTIPLERULES_ENVVARIABLESET', 1); define('MULTIPLERULES_DEFINEDCONSTANT', 'defined'); $config = $this->getConfigFixtureValue('MultipleRules'); diff --git a/tests/php/ORM/DBTest.php b/tests/php/ORM/DBTest.php index a5eb5dfdf..7590a3cf2 100644 --- a/tests/php/ORM/DBTest.php +++ b/tests/php/ORM/DBTest.php @@ -12,7 +12,7 @@ class DBTest extends SapphireTest public function testValidAlternativeDatabaseName() { - $prefix = defined('SS_DATABASE_PREFIX') ? SS_DATABASE_PREFIX : 'ss_'; + $prefix = getenv('SS_DATABASE_PREFIX') ?: 'ss_'; Director::config()->update('environment_type', 'dev'); $this->assertTrue(DB::valid_alternative_database_name($prefix.'tmpdb1234567'));