Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Структура проекта

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 — разные папки.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.