Документация¶
Сайт собирается из трёх источников, и два из них — сам код.
src/**/*.php (код + PHPDoc) ──► phpDocumentor + saggre/phpdocumentor-markdown ──► docs/api/*.md ─┐
examples/**/*.php (исполняемые примеры, их запускает ExamplesTest) ──► вставляются в страницы ───┤
docs/tutorial, how-to, reference, explanation, errors (пишутся руками) ─────────────────────────────┤
▼
Zensical ──► GitHub Pages
Генератор сайта — Zensical от авторов Material for MkDocs. Конфиг — обычный mkdocs.yml. Почему не MkDocs: ветка 1.x больше не развивается, а MkDocs 2.0 несовместим с темами и плагинами 1.x и не поддерживает нужные нам расширения Markdown. Если с Zensical что-то пойдёт не так, тот же mkdocs.yml собирается MkDocs 1.6 + Material 9.7 без изменений.
Структура: Diátaxis¶
Страницы разложены по четырём разделам Diátaxis — по тому, зачем читатель пришёл. Новая страница сначала получает раздел, потом текст. Если страница просится в два раздела сразу, это две страницы.
| Раздел | Папка | Читатель хочет | Как писать |
|---|---|---|---|
| Обучение | docs/tutorial/ |
впервые получить работающий результат | шаги, каждый с видимым результатом; без отступлений и вариантов |
| Рецепты | docs/how-to/ |
решить конкретную задачу | заголовок — задача глаголом («Настроить лог»); от проблемы к решению |
| Справочник | docs/reference/, docs/errors/ |
точно проверить факт | таблицы, полнота, без уговоров и истории |
| Как это устроено | docs/explanation/ |
понять, почему так | решение, причина, цена; без инструкций |
Тон — прямой и спокойный. Начинаем с проблемы читателя, а не с возможностей библиотеки. Без маркетинга и громких обещаний: что делает, чего не делает, чем за это платим. Обращаемся на «вы».
Команды¶
make docs-install # один раз: Python-окружение в var/venv
make docs # справочник API + сборка сайта в site/ (--strict: битые ссылки валят сборку)
make docs-serve # локальный сервер с автообновлением: http://127.0.0.1:8000
PHPDoc: справочник API¶
Справочник docs/api/ генерируется на каждую сборку, в git его нет. Всё, что в нём написано, берётся из докблоков публичных классов и методов.
- Первая строка докблока — краткое описание, она попадает в таблицы справочника.
- Ниже — подробное описание в Markdown.
- Пример использования — обычный блок кода
```phpвнутри докблока. Тег@exampleне используем: в phpDocumentor он ссылается на файл, а не на код в комментарии. - Типы пишем максимально точно (
non-empty-string,list<Route>,class-string<ListenerInterface>): они попадают в справочник и проверяются Psalm.
Исполняемые примеры¶
Пример в руководстве — это файл в examples/ (в корне репозитория, не в docs/: иначе он попал бы на сайт как статический файл). Тест tests/Docs/ExamplesTest.php запускает каждый файл отдельным процессом PHP:
- пример должен завершиться с кодом 0;
- если рядом лежит файл
.outс тем же именем, вывод примера должен с ним совпасть.
На страницу вставляется только нужная часть файла, между маркерами:
<?php
require __DIR__ . '/../../vendor/autoload.php'; // на странице этого не будет
// ...код, который увидит читатель...
На странице вставка всегда внутри блока кода, иначе Markdown разберёт PHP как текст. Это проверяет tests/Docs/MarkdownSnippetsTest.php:
```php
--8<-- "getting-started/check-installation.php:example"
```
```text
--8<-- "getting-started/check-installation.out"
```
<?php во вставке не нужен: подсветка PHP включена и без него (startinline в mkdocs.yml).
Страницы ошибок¶
Для каждого исключения src/**/SomethingWrong.php нужна страница docs/errors/something-wrong.md: что произошло, почему, как исправить. Текст исключения содержит ссылку на неё через Documentation::errorUrl('something-wrong'). Без страницы ArchitectureTest не пройдёт.
Публикация¶
.github/workflows/docs.yml собирает сайт на каждый pull request и при push в main публикует его на GitHub Pages. В настройках репозитория один раз нужно выбрать Settings → Pages → Source: GitHub Actions.