Конфігурація
Перед цим розділом перегляньте Налаштування — bootstrap і paths.php.
Concept Core збирає налаштування з PHP-файлів у config/, застосовує оверрайди середовища
(APP_ENV) і змінні з .env. Завантаження виконує
ConfigServiceProvider::boot() при першому зверненні до ConfigInterface.
Доступ у коді — через DI (ConfigInterface).
Порядок завантаження
Реалізація в ConfigServiceProvider. Кожен наступний крок перекриває попередній
для збіглих ключів (окрім кроку 2 — .env лише читається, злиття відбувається на кроці 4).
flowchart LR
A["1. config/*.php"]
B["2. .env читається"]
C["3. config/APP_ENV/*.php"]
D["4. .env → конфіг"]
E["app.timezone"]
A --> B --> C --> D --> E
- Базовий
config/— усі PHP-файли зливаються Noodlehaus Config. .env— завантажується через vlucas/phpdotenv;APP_ENVвизначає папку оверрайду.config/{APP_ENV}/— якщо каталог існує (dev,production…), його файли зливаються поверх базових.- Змінні
.env— записуються в конфіг (найвищий пріоритет). - Часовий пояс —
date_default_timezone_set()зapp.timezone.
APP_ENV зчитується з .env на кроці 2 і використовується лише для вибору
config/{APP_ENV}/. У фінальний конфіг воно потрапляє як app.env на кроці 4.
Мапінг .env → конфіг
Кожна змінна оточення перетворюється на ключ конфігу за правилом «перше підкреслення»:
ім’я ділиться на дві частини (ліміт explode('_', ..., 2)), переводиться в нижній регістр,
далі з’єднується крапкою.
APP_DEBUG=true → app.debug
DB_HOST=127.0.0.1 → db.host
LOG_MAX_FILES=14 → log.max_files
Глибше першого рівня через .env не задається: APP_FOO_BAR_BAZ стане
app.foo_bar_baz, а не вкладеним масивом. Складні структури — у PHP-файлах config/.
Булеві значення в .env (true, false, 0, 1)
коректно читаються через getBool().
Файл .env
Скопіюйте .env.example у .env у корені застосунку.
Не комітьте .env у репозиторій — лише приклад.
| Змінна .env | Ключ конфігу | Опис |
|---|---|---|
APP_NAME | app.name | Назва застосунку (консоль, логи) |
APP_TIMEZONE | app.timezone | Часовий пояс PHP (Europe/Kyiv, UTC) |
APP_ENV | app.env | Середовище: dev, production тощо; визначає папку оверрайду |
APP_DEBUG | app.debug | Режим налагодження: Whoops, кеш Twig off, Valinor FileWatchingCache |
LOG_LEVEL | log.level | Рівень Monolog: debug, info, error… |
LOG_MAX_FILES | log.max_files | Кількість ротаційних файлів логів |
LOG_DB_QUERIES | log.db_queries | Логувати SQL у storage/logs/query.log |
LOG_VALIDATION_DATA | log.validation_data | Логувати payload валідації FormRequest (з маскуванням) |
DB_DRIVER | db.driver | Драйвер БД (mysql) |
DB_HOST | db.host | Хост БД |
DB_PORT | db.port | Порт (у конфіг-файлі; ядро підключення поки не читає) |
DB_DATABASE | db.database | Ім’я бази даних |
DB_USERNAME | db.username | Користувач БД |
DB_PASSWORD | db.password | Пароль БД |
Оверрайд за APP_ENV
Якщо існує каталог config/{значення APP_ENV}/, усі PHP-файли з нього зливаються поверх
базового config/. Імена файлів і структура масивів — такі самі, змінюються лише потрібні ключі.
У skeleton за замовчуванням:
config/dev/app.php—app.debug = trueconfig/dev/telemetry.php—telemetry.enabled = trueconfig/production/app.php—app.debug = falseconfig/*/components.php— реєстрація компонентів для середовища
config/
├── app.php
├── telemetry.php
├── dev/
│ ├── app.php
│ ├── telemetry.php
│ └── components.php
└── production/
├── app.php
└── components.php
Файли config/
Кожен файл повертає масив; кореневий ключ зазвичай збігається з іменем файлу (без .php).
app.php
| Ключ | Тип | За замовч. | Призначення |
|---|---|---|---|
app.name | string | App | Назва застосунку (консоль, логи) |
app.version | string | 1.0.0 | Версія застосунку в Symfony Console |
app.timezone | string | UTC | Часовий пояс PHP (date_default_timezone_set) |
app.env | string | — | Середовище з APP_ENV (крок 4 завантаження); визначає config/{APP_ENV}/ |
app.locale | string | en | Локаль застосунку |
app.fallback_locale | string | en | Fallback для перекладів валідатора |
app.locale_resolver | class-string|null | null | Кастомний LocaleResolverInterface |
app.debug | bool | false | Whoops (web), Twig cache off, Valinor FileWatchingCache |
db.php
| Ключ | Тип | Призначення |
|---|---|---|
db.driver | string | Драйвер Illuminate DB |
db.host | string | Хост |
db.port | string | Порт (резерв у конфігу) |
db.database | string | База даних |
db.username | string | Користувач |
db.password | string | Пароль |
db.charset | string | Кодування (utf8mb4) |
log.php
| Ключ | Тип | За замовч. | Призначення |
|---|---|---|---|
log.name | string | app | Ім’я каналу Monolog |
log.level | string | ERROR | Мінімальний рівень (ERROR, debug…) |
log.max_files | int | 7 | Файлів при ротації (.env.example: 14) |
log.db_queries | bool | false | Логувати SQL через QueryLogger (ConfigKey::LOG_DB_QUERIES) |
log.validation_data | bool | false | Логувати дані валідації у FormRequest (з маскуванням) |
session.php
Параметри PHP-сесії (SessionServiceProvider → Symfony HttpFoundation → session_start()).
Ключі відповідають константам ConfigKey::SESSION_*.
| Ключ | Тип | За замовч. | Опис |
|---|---|---|---|
session.cookie_lifetime | int | 0 | Час життя cookie (0 — до закриття браузера) |
session.cookie_path | string | / | Шлях cookie |
session.cookie_secure | bool | false | Тільки HTTPS |
session.cookie_httponly | bool | true | HttpOnly |
session.use_only_cookies | bool | true | Без session id в URL |
session.cookie_domain | string | '' | Домен cookie (SESSION_COOKIE_DOMAIN у .env) |
session.cookie_samesite | string | Lax | Lax, Strict, None (SESSION_COOKIE_SAMESITE) |
session.use_strict_mode | bool | true | Строгий режим session id |
view.php
| Ключ | Тип | Призначення |
|---|---|---|
view.default_extension | string | Розширення шаблонів (.twig або .php для Plates) |
view.extensions | array<class-string> | Класи розширень Twig / Plates |
view.paths | array | Namespace → шлях від кореня застосунку (frontend → resources/views/frontend) |
view.contexts | array | Префікс URL → namespace views (/ → frontend) |
view.cache_dir | string | Підкаталог у storage/cache/ для скомпільованих Twig |
routes.php
Ключ routes — список файлів маршрутів і route interceptors (див. Маршрутизація, Route interceptors).
return [
'routes' => [
'interceptors' => [
// RouteInterceptorInterface::class,
],
'list' => [
dirname(__DIR__) . '/routes/web.php',
],
],
];
components.php
components — список FQCN класів, що реалізують ComponentInterface.
У середовищі може бути запис MyComponent::class => MyComponent::class —
ядро ітерує значення масиву. Компоненти додають маршрути, шляхи міграцій, seeders, views і CLI-команди через методи ComponentInterface.
return [
'components' => [
// AuthAdminComponent::class,
],
];
telemetry.php
| Ключ | Тип | Призначення |
|---|---|---|
telemetry.enabled | bool | Головний перемикач TelemetryCollector (ConfigKey::TELEMETRY_ENABLED) |
telemetry.db_queries | bool | Записувати події DB_QUERY_EXECUTED (незалежно від log.db_queries) |
telemetry.logs | bool | Дублювати записи Monolog як LOG_RECORDED через TelemetryLogHandler |
masking.php
Маскування чутливих даних перед записом у логи і debug-панелі.
Читає DataMaskerServiceProvider → DataMaskerInterface.
Повний опис — Маскування даних.
| Ключ | ConfigKey | Призначення |
|---|---|---|
masking.patterns | MASKING_PATTERNS | Масив regex → заміна для рядків (RegexDataMaskerRule::apply) |
masking.key_patterns | MASKING_KEY_PATTERNS | Regex для імен ключів у масивах (password, token…) |
masking.rules | MASKING_RULES | Список класів DataMaskerRuleInterface (DI) |
// config/masking.php (фрагмент skeleton)
'masking' => [
'patterns' => [
'/[a-z0-9_\-\+\.]+@[a-z0-9\-]+\.[a-z]{2,}/i' => '***@***.***',
],
'key_patterns' => [
'/.*password.*/i',
'/.*token.*/i',
],
'rules' => [],
],
validator.php
validator.rules — кастомні правила валідації (unique, exists тощо).
caster.php
caster.transformers — список класів кастомних трансформаторів для мапінгу DTO через Valinor.
Відповідає ConfigKey::CASTER_TRANSFORMERS.
pagination.php
pagination.per_page — зручне значення за замовчуванням для коду застосунку (у skeleton: 10).
Ядро не читає цей ключ автоматично; HttpServiceProvider лише налаштовує
Paginator::currentPageResolver і currentPathResolver для Illuminate Pagination.
migrations.php
| Ключ | Призначення |
|---|---|
migrations.table | Таблиця обліку міграцій |
migrations.paths | Каталоги з класами міграцій |
seeders.php
seeders.list — масив класів сидерів для db:seed (усі разом).
Один сидер: db:seed -c "Fully\Qualified\SeederClass" — потрібен повний FQCN.
commands.php
commands — список класів Symfony Console команд ядра та застосунку.
У skeleton уже зареєстровані route:list, db:migrate, view:clear тощо.
Ключі ConfigKey
Канонічні ключі, які читає ядро, зібрані в
Concept\Core\Foundation\ConfigKey. У власному коді краще посилатися на ці константи,
ніж на рядкові літерали:
use Concept\Core\Foundation\ConfigKey;
$debug = $config->getBool(ConfigKey::APP_DEBUG);
$routes = $config->get(ConfigKey::ROUTES_LIST, []);
Повний перелік констант — у вихідному коді code/core/src/Foundation/ConfigKey.php
та в README ядра (розділ Configuration).
Доступ у коді
Інжектуйте Concept\Core\Services\Config\Contracts\ConfigInterface:
public function __construct(
private readonly ConfigInterface $config,
) {}
$debug = $this->config->getBool('app.debug');
$name = $this->config->getString('app.name');
$routes = $this->config->get('routes', []);
Методи: get(), has(), set(), all(),
getString(), getInt(), getBool().
Поради для розробки
- Локально встановіть
APP_ENV=devіAPP_DEBUG=trueу.env. - Секрети (паролі, API-ключі) — лише в
.env, не вconfig/*.php. - Спільні значення за замовчуванням — у
config/; відмінності середовища — уconfig/dev/абоconfig/production/. - Нові змінні оточення дотримуйтесь конвенції
GROUP_NAME→group.name. - Очистіть кеш Twig після зміни шаблонів:
php bin/console.php view:clear.