我正在将Slim 2.x升级到3.x,以修复安全问题。当前在Slim 2中,我们正在使用configureMode来存储特定于环境的数据库连接。 3.0升级指南仅说明configureMode已删除,但没有告诉您使用什么。我从来没有像其他人一样在PHP中工作过(传统产品)。
在我的.htaccess文件中,我们正在设置环境
SetEnv SLIM_MODE development
在我的index.php中,当前我们使用configureMode设置数据库属性
$app->configureMode('development', function () use ($app) {
$app->config(array(
'masterDB' => array(
'dbhost' => 'DEVDB',
'dbuser' => 'USER',
'dbpass' => 'PASS',
'dbname' => 'MASTER'
),
'userDB' => array(
'dbuser' => 'USER',
'dbpass' => 'PASS'
),
'debug' => false
));
});
/**
* QA configuration
*/
$app->configureMode('qa', function () use ($app) {
$app->config(array(
'masterDB' => array(
'dbhost' => 'DEVDB',
'dbuser' => 'USER',
'dbpass' => 'PASS',
'dbname' => 'MASTER'
),
'userDB' => array(
'dbuser' => 'USER',
'dbpass' => 'PASS'
),
'debug' => false
));
});
为了访问这些值,我们使用了已被删除的getInstance。
$app = \Slim\Slim::getInstance();
本教程只是说这些已被删除,我不确定如何替换。 Slim 3.x可以支持我们当前使用的环境配置,还是现在需要在安装到该环境中的过程中设置它?
现在设置和访问这些值的正确方法是什么?
答案 0 :(得分:0)
几年来我一直在使用Slim 3,并且我确定没有“正式的”方式来配置特定于环境的设置。但是我想告诉你我该怎么做。
首先在项目根目录中创建目录config/
。
然后将所有配置文件放入此config/
目录。
config/defaults.php
该文件包含所有环境的所有默认设置。
<?php
//
// Configure defaults for the whole application.
//
// Error reporting
error_reporting(0);
ini_set('display_errors', '0');
// Timezone
date_default_timezone_set('Europe/Berlin');
// Slim settings
$settings = [
'httpVersion' => '1.1',
'responseChunkSize' => 4096,
'outputBuffering' => 'append',
'determineRouteBeforeAppMiddleware' => true,
'displayErrorDetails' => false,
'addContentLengthHeader' => true,
'routerCacheFile' => false,
];
config/development.php
<?php
//
// Development environment
//
$settings['env'] = 'development';
// Error reporting
error_reporting(E_ALL);
ini_set('display_errors', '1');
// Display all errors
$settings['displayErrorDetails'] = true;
$settings['db']['host'] = '{{db_host}}';
$settings['db']['database'] = '{{db_database}}';
针对integration.php
,staging.php
和production.php
重复此步骤。
env.php
来定义有效的环境。注意:请不要将此文件提交到git。
<?php
/**
* Environment specific application configuration.
*
* You should store all secret information (username, password, token) here.
*
* Make sure the env.php file is added to your .gitignore
* so it is not checked-in the code
*
* Place the env.php _outside_ the project root directory, to protect against
* overwriting at deployment.
*
* This usage ensures that no sensitive passwords or API keys will
* ever be in the version control history so there is less risk of
* a security breach, and production values will never have to be
* shared with all project collaborators.
*/
require __DIR__ . '/development.php';
// Database
$settings['db']['username'] = '{{db_username}}';
$settings['db']['password'] = '{{db_password}}';
// SMTP
$settings['smtp']['username'] = 'user@example.com';
$settings['smtp']['password'] = '';
config/settings.php
:<?php
// Defaults
require __DIR__ . '/defaults.php';
// Load environment configuration
if (file_exists(__DIR__ . '/../../env.php')) {
require __DIR__ . '/../../env.php';
} elseif (file_exists(__DIR__ . '/env.php')) {
require __DIR__ . '/env.php';
}
if (defined('APP_ENV')) {
require __DIR__ . '/' . APP_ENV . '.php';
}
return $settings;
在您的config/bootstrap.php
中,您可以加载所有设置并将该配置传递给Slim App实例:
// Instantiate the app
$app = new \Slim\App(['settings' => require __DIR__ . '/../config/settings.php']);
// Set up dependencies
// Register middleware
// Register routes
$app->run();
答案 1 :(得分:0)
您要问的实际上是与框架无关的问题。有vlucas/phpdotenv之类的库可帮助您进行特定于环境的设置。如果您不想使用这样的库,则可以使用简单的机制来覆盖配置设置,例如@odan建议的解决方案,但我认为这可能会更简单一些。这是我之前实际使用的解决方案:
默认设置(async_accept
):
settings.default.php
环境设置(<?php
return array(
'cache-driver' => 'redis',
'debug' => false,
);
):
env.php
如果存在<?php
return array(
'debug' => true,
'userDB' => array(
'dbuser' => 'env-db-user',
'dbpass' => 'env-db-pass'
),
);
,则合并两个文件中的数组,可能在env.php
或index.php
中:
app.php
现在<?php
$defaultSettings = require 'settings.default.php';
$environmentSettings = file_exists('env.php') ? require 'env.php' : array();
$settings = array_merge($defaultSettings, $environmentSettings);
$app = new App($settings);
将输出:
print_r($settings)
如您所见,Array
(
[cache-driver] => redis
[debug] => 1
[userDB] => Array
(
[dbuser] => env-db-user
[dbpass] => env-db-pass
)
)
的值来自默认设置,cache-driver
被覆盖,debug
仅在此环境中可用。这意味着您可以针对不同的环境使用不同的设置数组,这使您可以控制依赖于这些值的对象的行为。