Slim 2.x到3.x升级-configureMode和getInstance替换

时间:2019-05-13 22:44:18

标签: slim slim-3

我正在将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可以支持我们当前使用的环境配置,还是现在需要在安装到该环境中的过程中设置它?

现在设置和访问这些值的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

几年来我一直在使用Slim 3,并且我确定没有“正式的”方式来配置特定于环境的设置。但是我想告诉你我该怎么做。

首先在项目根目录中创建目录config/

然后将所有配置文件放入此config/目录。

  1. 创建文件: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,
];

Full example

  1. 然后为开发环境创建一个配置文件: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.phpstaging.phpproduction.php重复此步骤。

  1. 然后创建文件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'] = '';
  1. 然后创建合并所有其他配置文件的文件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建议的解决方案,但我认为这可能会更简单一些。这是我之前实际使用的解决方案:

  1. 将默认的通用设置放入数组中。 (可选)您可以将放入文件中
  2. 在每个环境中,创建一个文件(具有相同的名称),仅包括该环境的设置
  3. 合并这两个数组,以特定于环境的键覆盖默认设置中的相同键。这些文件应具有

默认设置(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.phpindex.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仅在此环境中可用。这意味着您可以针对不同的环境使用不同的设置数组,这使您可以控制依赖于这些值的对象的行为。