Структура проекта
Slim не задаёт структуру проекта: приложение в одном файле работает так же, как разложенное по папкам. Но index.php на сотни строк быстро становится неуправляемым. В этом уроке код из первой главы переезжает в несколько файлов — на этой раскладке построен весь дальнейший курс.
Папки
Создайте вручную папки config и src рядом с public:
blog/
├── config/
│ ├── bootstrap.php ← сборка приложения
│ └── routes.php ← все маршруты
├── public/
│ └── index.php ← точка входа
├── src/ ← классы приложения
├── vendor/
└── composer.json| Папка | Что в ней лежит |
|---|---|
public/ | Только то, что доступно браузеру |
config/ | Файлы, которые собирают и настраивают приложение |
src/ | Ваши классы: действия, посредники, работа с базой |
В следующих уроках к ним добавятся templates/ для шаблонов и var/ для кеша и журналов.
Автозагрузка классов
Чтобы классы из src подключались сами, без require, добавьте в composer.json раздел autoload:
{
"require": {
"slim/slim": "4.*",
"slim/psr7": "^1.7"
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}Раздел require у вас уже есть — добавляется только autoload. Затем выполните:
composer dump-autoloadТеперь действует правило: пространство имён App соответствует папке src. Класс App\Action\HomeAction должен лежать в файле src/Action/HomeAction.php.
Файл маршрутов
Создайте config/routes.php. Файл возвращает функцию, которая получает приложение и объявляет в нём маршруты:
// config/routes.php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\App;
return function (App $app): void {
$app->get('/', function (Request $request, Response $response) {
$response->getBody()->write('Главная страница блога');
return $response;
})->setName('home');
};Сюда переносятся все маршруты из public/index.php.
Файл сборки
Создайте config/bootstrap.php. Он создаёт приложение, подключает маршруты и возвращает готовый объект:
// config/bootstrap.php
use Slim\Factory\AppFactory;
require __DIR__ . '/../vendor/autoload.php';
$app = AppFactory::create();
(require __DIR__ . '/routes.php')($app);
return $app;Строка с require читается так: подключить файл, получить из него функцию и сразу вызвать её с $app.
Точка входа
В public/index.php остаются две строки:
// public/index.php
$app = require __DIR__ . '/../config/bootstrap.php';
$app->run();Запустите сервер прежней командой php -S localhost:8080 -t public и откройте главную страницу — на ней будет «Главная страница блога». Приложение работает как раньше, но сборка отделена от запуска: позже тот же bootstrap.php подключат тесты.
Частая ошибка
После правки раздела autoload в composer.json нужно выполнить composer dump-autoload, иначе PHP сообщит Class "App\..." not found. Та же ошибка появляется, когда имя файла или папки не совпадает с именем класса и пространством имён — с точностью до регистра букв: на Linux src/action и src/Action — разные папки.