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
  1. /contact і /api/stats — як на кроці 11.
  2. Переконайся, що в Bootstrap немає $rootPath . — лише PathManager.

Лінія рецептів завершена. Далі — огляд ConceptStack і розділ Extensions. Усі кроки — Огляд.