12. PathManager
На кроці 11 значення винесли в config/ і .env,
але шляхи в ApplicationStackBootstrap ще збирались як
$rootPath . 'storage/logs/…'. Це дублює рядки й прив’язує Bootstrap
до структури каталогів. Крок 12 вводить PathManager —
іменовані ключі з bootstrap/path-map.php.
Що додається
bootstrap/path-map.php— мапа ключ → відносний шляхPathName— константи ключів (glue додатку)FoundationBootstrap— PathManager + Config (замістьConfigBootstrap)ApplicationStackBootstrap—$pathManager->get(PathName::…)
composer.json
{
"require": {
"php-concept/extension-config": "^1.0",
"php-concept/extension-path-manager": "^1.0"
}
}
path-map.php
У рецепті — мінімум шляхів для contact-app; у повному додатку карта ширша
(lang, окремі seeders тощо). Ключі — рядки з PathName.
return [
PathName::CONFIG => 'config',
PathName::MIGRATIONS => 'database/migrations',
PathName::ROUTES => 'routes',
PathName::VIEWS => 'resources/views',
PathName::LOGS => 'storage/logs',
PathName::CACHE => 'storage/cache',
// …
];
FoundationBootstrap
Спочатку PathManager, потім Config з каталогу
$pathManager->get(PathName::CONFIG).
$pathMap = require __DIR__ . '/path-map.php';
$root = dirname(__DIR__);
(new FoundationBootstrap($root, $pathMap))->boot($container);
(new ApplicationStackBootstrap())->boot($container);
(new ApplicationRuntimeBootstrap())->boot($container);
ApplicationStackBootstrap
$pathManager = ContainerDependency::get($container, PathManager::class);
$stack->addHttp()->setRoutes([
$pathManager->get(PathName::ROUTES, 'web.php'),
$pathManager->get(PathName::ROUTES, 'api.php'),
]);
$stack->addLogging()
->toRotatingFile($pathManager->get(PathName::LOGS, $appLogFile), …);
Другий аргумент get() — підшлях (файл логу, casting, views cache).
Значення як і раніше з Config; змінились лише шляхи.
Запуск і перевірка
Тег step-12-path-manager. Поведінка як на кроці 11.
git checkout step-12-path-manager
cp .env.example .env
rm -rf storage/cache storage/sessions storage/logs
composer install
docker compose up -d
- /contact і /api/stats — як на кроці 11.
- Переконайся, що в Bootstrap немає
$rootPath .— лишеPathManager.
Лінія рецептів завершена. Далі — огляд ConceptStack і розділ Extensions. Усі кроки — Огляд.