Yii2: Config params vs. const / define

Когда я должен использовать что?

У меня есть возможность определить константы в файле сценария ввода index.php, как это рекомендуется в Руководство Yii2: константы. Или я мог бы использовать параметры в конфигурации — объяснено в Руководство по YII2: params. И то, и другое относится к приложениям и не является глобальным

В настоящее время мне кажется, что параметры немного менее удобны, если я хочу объединить такие значения:

define('SOME_URL',            'http://some.url');
define('SOME_SPECIALIZED_URL', SOME_URL . '/specialized');

Кроме того, доступ немного больше кода (Yii::$app->params['something']) по сравнению с константами.

Итак, когда я должен или могу использовать что?

Небольшое обновление: в PHP 7 define() также поддерживает массивы, так что вся структура params может быть сконфигурирована как константа. Вероятно, лучше поддерживается IDE.

2

Решение

Я склонен использовать параметры приложения Yii. Основная причина этого заключается в том, что значения, содержащиеся в таких параметрах, имеют тенденцию изменяться в зависимости от среды, в которой выполняется код. Поэтому у меня будет система сборки, которая выполняется (я использую Phing) и извлекает настройки из файла, не управляемого версиями, такого как build.properties.

Поэтому любые настройки базы данных dev, настройки домена dev, адреса песочницы api и т. Д. Будут загружены в мою среду разработки, и при сборке на работающем сервере будут использоваться правильные производственные значения.

Если вы настраивали эти значения в каком-то php-файле, то отслеживание с контролем версий становится проблематичным, потому что каждый раз, когда вы встраиваете в свою среду разработки, изменения вносятся в ваш файл index.php. Кто-то может даже в конечном итоге совершить эти изменения по ошибке.

Итак, в заключение, я бы сказал, что если они являются истинными константами — одинаковыми в любой среде, в которой выполняется код, — возможно, они постоянны, и это нормально. Если эти значения могут измениться, в зависимости от того, где выполняется код, тогда я предпочитаю поместить их в параметры и позволить вашей системе сборки загружать их из файла, не управляемого версией.

0

Другие решения

Основным недостатком (и одновременно преимуществом) констант является то, что они … постоянны. Как только вы установите его, вы не сможете его изменить. Это единственное, что должно иметь значение здесь. Вы должны использовать константы для значений, которые никогда не должны изменяться во время выполнения, и параметры для всего остального.

Константы могут быть настоящей PITA, когда вы начинаете писать тесты для своего приложения. Это покажет вам, что многие вещи, которые вы рассматривали как постоянные, на самом деле не являются постоянными. На этом этапе параметры более гибкие — вы можете легко изменить их или настроить на уровне конфигурации, используя объединение массивов конфигурации. Использование констант может привести вас к ловушке неконфигурируемого приложения, которое невозможно установить в другой среде без изменения жестко закодированной константы.

Кроме того, доступ немного больше кода (Yii::$app->params['something']) по сравнению с константами.

Это совершенно не имеет значения. Как программист, вы тратите меньше 5% своего времени на написание кода. Дополнительные 10 нажатий клавиш не будут иметь никакого значения. Вы всегда должны думать об этом с точки зрения читабельности. Вы пишете код один раз и читаете его сотни раз, поэтому гораздо важнее, сколько времени вам понадобится, чтобы прочитать и понять код, чем время, потраченное на его написание. И используя известные соглашения (и Yii::$app->params является одним из них) делает ваш код легче для понимания, особенно для других программистов.

Но если вы действительно хотите писать меньше кода, вы всегда можете создать функцию-оболочку для короткого доступа к параметрам.

function p($name) {
return Yii::$app->params[$name];
}

echo p('my-param');
0