Структура каталогів
Concept Core не нав’язує жодну структуру каталогів. Розташування усіх папок —
включно з src, config, storage, database —
можна змінити на свій смак у bootstrap/paths.php
і в PSR-4 автозавантаженні composer.json.
Concept Skeleton постачає готовий каркас із розкладкою
src/App/ (component-ready). Нижче — рекомендована коренева структура проєкту
та три поширені підходи до організації коду всередині src.
Це орієнтири, а не обов’язковий стандарт.
Кореневі каталоги (public, bootstrap, config тощо) —
рекомендована угода для старту. Їх можна перейменувати або перенести, якщо оновити
paths.php і налаштування веб-сервера.
Рекомендована коренева структура
Відповідає Concept Skeleton
і ключам у bootstrap/paths.php:
project/
├── public/ # document root: index.php, assets, vendor/
│ ├── index.php
│ ├── assets/
│ └── vendor/
├── bootstrap/
│ ├── app.php
│ ├── paths.php
│ └── providers/ # app.php, console.php
├── bin/console.php
├── config/ # PHP-конфіг + config/{dev,production}/
├── routes/ # маршрути (підключаються з config)
├── resources/
│ ├── lang/validator/ # PathName::VALIDATOR_TRANSLATIONS
│ └── views/
│ ├── errors/fallback/ # PathName::ERRORS_FALLBACK_VIEWS
│ └── frontend/
├── database/
│ ├── migrations/ # PathName::MIGRATIONS
│ └── seeders/ # PathName::SEEDERS
├── storage/
│ ├── logs/ # PathName::LOGS
│ └── cache/ # PathName::CACHE
├── src/ # PathName::SRC — код застосунку
├── tests/
├── .env.example
└── composer.json
Шлях до кожного з цих каталогів задається в
paths.php
через константи PathName (PathName::CONFIG, PathName::SRC,
PathName::LOGS тощо). Ядро звертається до них через
PathManager::get(PathName::…), а не через жорстко прошиті рядки.
Наприклад, код можна тримати в app/ замість src/ — достатньо змінити
значення для PathName::SRC і namespace у Composer.
Concept Skeleton за замовчуванням
Стартовий шаблон використовує component-ready розкладку: спільний код у
src/App/, глобальні маршрути в routes/web.php, landing-шаблони в
resources/views/frontend/. Компоненти (src/Components/) додаються за потреби.
src/App/
├── Controllers/ # Concept\App\Controllers\* (IndexController)
└── Extensions/Twig/ # Concept\App\Extensions\Twig\*
routes/web.php # глобальні маршрути + middleware стек
resources/views/frontend/ # @frontend/… — landing, спільні сторінки
Composer (skeleton):
"autoload": {
"psr-4": {
"Concept\\": "src/",
"Database\\Seeders\\": "database/seeders/"
}
}
paths.php: повний набір ключів PathName
(деталі).
Провайдери вже підключені в bootstrap/providers/ — див.
Налаштування.
Організація коду в каталозі src
Окрім розкладки skeleton (src/App/), можна обрати шарову MVC або модульні компоненти.
Усі три варіанти сумісні з Concept Core.
1. Шарова MVC (package by layer)
Класична шарова архітектура (layered architecture): код групується за типом (контролери, моделі, запити), а не за модулем. У PHP-спільноті це часто називають package by layer — протилежність до «package by feature».
Шари лежать безпосередньо в каталозі з кодом (наприклад src/), без проміжних папок
на кшталт App чи Components:
src/
├── Controllers/ # Concept\Controllers\*
├── Models/ # Concept\Models\*
├── Requests/ # FormRequest, DTO-запити
├── Validation/
│ └── Rules/
├── Extensions/
│ └── Twig/
├── Services/ # опційно: бізнес-логіка
└── Middlewares/ # опційно: HTTP middleware
Namespace відповідає PSR-4: при "Concept\\": "src/" клас
src/Controllers/HomeController.php має namespace
Concept\Controllers, а не Concept\App\Controllers.
Коли обирати: невеликі застосунки, один домен, мало модулів; команда звикла до класичного MVC (Symfony 2–4, ранній Laravel).
Мінуси: при зростанні проєкту складно знайти «все про замовлення» — файли розкидані по шарах.
Composer (приклад):
"autoload": {
"psr-4": {
"Concept\\": "src/"
}
}
paths.php: PathName::SRC => 'src'
(деталі).
2. Компоненти (модульний моноліт)
Модульний моноліт з підключаємими компонентами: спільне ядро застосунку + ізольовані функціональні модулі. Це поєднання package by feature (всередині кожного компонента) і шарів MVC. Підтримується системою компонентів Concept Core.
src/
├── App/ # спільний код застосунку
│ ├── Controllers/ # глобальні контролери
│ ├── Models/ # BaseModel, спільні трейти
│ ├── Requests/
│ ├── Validation/Rules/
│ ├── Extensions/Twig/
│ └── Services/
└── Components/ # функціональні модулі
├── AuthAdmin/
│ ├── AuthAdminComponent.php
│ ├── routes.php
│ ├── Controllers/
│ ├── Models/
│ ├── Requests/
│ ├── Dto/
│ ├── Middlewares/
│ ├── Commands/
│ ├── Services/
│ ├── Enums/
│ ├── Extensions/
│ ├── Views/ # Twig модуля (@auth-admin/…)
│ ├── Assets/ # JS/CSS → public через CLI
│ └── Database/
│ ├── Migrations/
│ └── Seeders/
├── UserCabinet/
└── ProjectManager/
Кожен компонент — клас, що напряму реалізує ComponentInterface
(migrationPaths(), viewPaths(), seeders(),
commands(), assets(), providers() тощо).
Активні модулі перелічуються в
config/components.php або config/{env}/components.php.
Компоненти можуть мати власні маршрути, views, міграції, сидери, CLI-команди та assets.
Каталог App — для спільних речей (базові моделі, Twig extensions, правила валідації).
Покроковий приклад — AuthAdmin.
Коли обирати: кілька підсистем (адмінка, кабінет, публічна частина), потрібно вмикати або вимикати модулі через конфіг, різні команди працюють над окремими компонентами.
Порівняння
| Шарова MVC | Компоненти | Concept Skeleton | |
|---|---|---|---|
| Академічна назва | Layered / package by layer | Modular monolith, package by feature | Component-ready App/ |
| Розмір проєкту | Малий — середній | Середній — великий | Старт — будь-який |
Організація src |
Controllers/ на верхньому рівні |
App/ + Components/ |
App/ (+ опційно Components/) |
| Namespace (приклад) | Concept\Controllers\* |
Concept\App\*, Concept\Components\* |
Concept\App\* |
| Маршрути | routes/web.php |
+ routes.php у кожному компоненті |
routes/web.php |
| Concept Core | Повна підтримка | + підсистема компонентів | Готовий каркас + провайдери |
| Composer PSR-4 | Concept\\ → src/ |
Concept\\ → src/ |
+ Database\\Seeders\\ |
Views, lang, storage
Шляхи налаштовуються в paths.php
через константи Concept\Core\Foundation\PathName.
Ядро звертається до них через PathManager::get(PathName::…).
| Що | PathName | Шлях у skeleton |
|---|---|---|
| Спільні Twig-шаблони | PathName::VIEWS |
resources/views/ (@frontend/, layouts) |
| Fallback-шаблони помилок | PathName::ERRORS_FALLBACK_VIEWS |
resources/views/errors/fallback/ |
| Мовні файли | PathName::LANG |
resources/lang/ |
| Переклади валідатора | PathName::VALIDATOR_TRANSLATIONS |
resources/lang/validator/ |
| Шаблони модуля | ComponentInterface::viewPaths() |
src/Components/{Name}/Views/ → @auth-admin/… |
| Міграції застосунку | PathName::MIGRATIONS |
database/migrations/ + шляхи в config/migrations.php |
| Сидери застосунку | PathName::SEEDERS |
database/seeders/ (namespace Database\Seeders\) |
| Логи | PathName::LOGS |
storage/logs/ |
| Кеш | PathName::CACHE |
storage/cache/ (Twig, Valinor тощо) |
| Assets компонента | ComponentInterface::assets() |
component:publish-assets → public/components/… (php bin/console.php component:publish-assets) |
Повний перелік ключів — у таблиці PathName.
Міграції та сидери окремих компонентів реєструються через
migrationPaths() і seeders() класу компонента,
а не через глобальні PathName::MIGRATIONS / PathName::SEEDERS.
Що обрати
- Concept Skeleton — швидкий старт: HTTP + Twig,
src/App/, готові провайдери; компоненти додаються за потреби. - Шарова MVC — простий старт без
App/, один домен, мало модулів. - Компоненти — кілька підсистем, потрібна ізоляція модулів і підтримка ядра Concept.
Структуру можна змінити в будь-який момент: оновіть
paths.php, composer.json і конфіг.
Далі: життєвий цикл запиту та налаштування точок входу.