composer require neznaika0/codeigniter-enhanced-configВ настоящее время, версия CodeIgniter 4.7.х не поддерживает гибкие настройки конфигурационных классов. Особенную боль вызывает работа с массивами: для настройки через .env требуется заранее установить допустимые значения; через Registrars нельзя удалить ключи или изменить порядок.
Есть несколько способов настройки вашего проекта:
- Выполнить все изменения прямо в рабочем каталоге app/Config/, это рекомендованный способ. Но при обновлении фреймворка вам предстоит повторно проверить и восстановить ваши значения.
- Создать Config/Registrar.php в рабочем каталоге или модуле имеет больше возможностей. Можно применить различные функции для динамической настройки. Но всё ещё имеется ограничение для массивов.
- Файл .env позволяет частично редактировать только уже известные ключи массива.
- Для модулей применить вариант с
Publisher. Обновятся классы путём замены кода с помощью регулярных выражений. Минус такого подхода - никогда не знаешь как повлияет замена, если файл отличается от оригинального из фреймворка. - Для особенных случаев возможно создать собственный обработчик, добавив
ReflectionClass.
Если я не ошибаюсь, всё что нам нужно, это получить текущее значение конфига при работе с Registrar. Официальный патч не рекомендован для CodeIgniter, так как может нарушить безопасность. В частности разработчики модулей смогут взаимодействовать с данными из конфигурации.
Для меня нет причин бояться этого. Поэтому создал пакет для всех желающих попробовать.
В общем и целом, логика почти не поменялась:
- Добавьте в желаемые конфигурационные классы трейт:
<?php
namespace Config;
use CodeIgniter\Config\BaseConfig;
use Neznaika0\CodeIgniterEnhancedConfig\EnhancedRegistrarTrait;
class App extends BaseConfig
{
use EnhancedRegistrarTrait;- Создайте файл app/Config/Registrar.php или в директории модуля module_dir/Config/Registrar.php.
- Добавьте новые значения используя текущие параметры из
$currentProperties:
class Registrar
{
/**
* @param array<string, mixed> $currentProperties
*
* @return array<string, mixed>
*/
public static function App(array $currentProperties): array
{
// $currentProperties contains values from App
return [
'baseURL' => 'http://domain.com:8080/',
// Use the previous values
'supportedLocales' => array_merge($currentProperties['supportedLocales'], ['ru']),
// or replace it completely
'supportedLocales' => ['ru', 'en', 'de'],
];
}Помните про важные особенности:
- Значение после
Registrarбудет перезаписано из .env. - Не изменяйте типизацию свойств.
- Не все классы расширяют
BaseConfig. - Порядок вызова нескольких
Registrarможет быть разным.
Если вы нашли ошибки или есть предложения по улучшению, можете отправить PR или открыть Проблему.