Я работаю над обновлением 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 поддерживать конфигурацию среды, которую мы используем в настоящее время, или теперь ее нужно устанавливать во время установки в эту среду?
Каков правильный способ установить и получить доступ к этим значениям сейчас?

Я работаю с 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'] = '[email protected]';
$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();
То, о чем вы спрашиваете, на самом деле является проблемой, не зависящей от фреймворка. Существуют библиотеки, такие как vlucas/phpdotenv, которые помогают настроить параметры среды. Если вы предпочитаете не использовать такую библиотеку, у вас может быть простой механизм для переопределения параметров конфигурации, например решение, предложенное @odan, но, на мой взгляд, это может быть немного проще. Вот решение, которое я использовал раньше:
Настройки по умолчанию (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 перезаписывается, а userDB доступно только в этой среде. Это означает, что вы можете иметь разные массивы настроек для разных сред, что позволяет вам контролировать поведение объектов, полагаясь на эти значения.