Обновление Slim 2.x до 3.x — замена configureMode и getInstance

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

Каков правильный способ установить и получить доступ к этим значениям сейчас?

PHP-фреймворки в 2023 году
PHP-фреймворки в 2023 году
В 2023 году на выбор веб-разработчиков будет представлено несколько PHP-фреймворков. Вот несколько будущих PHP-фреймворков и их веб-сайты, на которые...
0
0
143
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я работаю с 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,
];

Полный пример

  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.php, staging.php и production.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'] = '[email protected]';
$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();

То, о чем вы спрашиваете, на самом деле является проблемой, не зависящей от фреймворка. Существуют библиотеки, такие как vlucas/phpdotenv, которые помогают настроить параметры среды. Если вы предпочитаете не использовать такую ​​библиотеку, у вас может быть простой механизм для переопределения параметров конфигурации, например решение, предложенное @odan, но, на мой взгляд, это может быть немного проще. Вот решение, которое я использовал раньше:

  1. Поместите общие настройки по умолчанию в массив. При желании вы можете поместить в файл
  2. В каждой среде создайте файл (с тем же именем), включая настройки только для этой среды.
  3. Объедините эти два массива таким образом, чтобы ключи, специфичные для среды, перезаписывали одни и те же ключи из настроек по умолчанию. Эти файлы должны иметь

Настройки по умолчанию (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 доступно только в этой среде. Это означает, что вы можете иметь разные массивы настроек для разных сред, что позволяет вам контролировать поведение объектов, полагаясь на эти значения.

Другие вопросы по теме