Перейти к основному содержимому

Symfony — первая программа

Разработчику Архитектору

Для читателей, которые знают основы PHP (первая программа, синтаксис) и Composer. Symfony — компонентный фреймворк для веб-приложений и API: маршруты, DI-контейнер (Dependency Injection), Twig, явная конфигурация YAML и PHP-атрибутов.

Расширенный разбор с Lab-плеем — в 1441.md; здесь — пошаговый маршрут от нуля до HTML-страницы, JSON API и сервиса с DI.

ШагТемаЗачем
1Требования и CLIПроверить PHP и Composer
2symfony newКаркас проекта
3Контроллер и маршрутURL → Response
4TwigHTML-шаблон
5JSON APIREST для фронта
6Сервис и DIЛогика вне контроллера
7Env и отладкаКонфиг и типичные ошибки
ТерминЗначение
KernelЯдро: загрузка бандлов, обработка запроса
ControllerКласс, возвращающий Response
RouteСопоставление URL → контроллер
TwigШаблонизатор {{ variable }}
DIЗависимости через конструктор автоматически
BundleПакет функций (Framework, Twig, Security)

Обзор экосистемы — Symfony, фреймворки PHP.

Редактор и терминал

Symfony CLI поднимает локальный HTTPS-сервер с одной командой. Логи запросов видны в терминале — удобно при первой отладке маршрутов.


Шаг 1 — требования

КомпонентВерсия
PHP8.2+
Composer2.x
Symfony CLIРекомендуется (symfony.com/download)
Расширения PHPctype, iconv, json, mbstring

Проверка:

php -v
composer -V
symfony -v

Локальный сервер и Docker — 113 локальная среда.


Шаг 2 — создать проект

symfony new hello-symfony --webapp
cd hello-symfony
composer install
symfony server:start

Откройте https://127.0.0.1:8000 — welcome-страница Symfony. CLI выдаёт URL и предупреждение о self-signed сертификате — для локальной разработки это нормально.

Структура:

hello-symfony/
bin/console ← CLI Symfony (миграции, cache, debug)
config/ ← routes, services, packages
public/index.php ← единственная точка входа для веба
src/Controller/ ← ваши контроллеры
templates/ ← Twig
var/ ← cache, logs (не коммитить)
vendor/ ← Composer deps
composer.json
.env
КаталогНазначение
public/Document root — наружу только он
src/PHP-код приложения (PSR-4 App\)
config/Маршруты, сервисы, пакеты
templates/Twig-шаблоны
var/Кэш и логи
vendor/Зависимости Composer

Поток запроса:

HTTP → public/index.php → Kernel → Router → Controller → Response

HTTP и маршруты, веб-разработка.


Шаг 3 — контроллер и маршрут

Создайте src/Controller/HelloController.php:

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;

final class HelloController extends AbstractController
{
#[Route('/hello/{name}', name: 'app_hello', methods: ['GET'])]
public function hello(string $name): Response
{
return $this->render('hello/index.html.twig', [
'name' => $name,
]);
}

#[Route('/api/hello', name: 'api_hello', methods: ['GET'])]
public function apiHello(): JsonResponse
{
return $this->json(['message' => 'Hello from Symfony API']);
}
}

Разбор:

  • #[Route(...)] — PHP 8 атрибут вместо YAML-маршрута в config/routes.yaml.
  • {name} в path автоматически попадает в аргумент $name (param converter по типу).
  • $this->render() — Twig-ответ с массивом переменных.
  • $this->json() — JSON с правильным Content-Type.

Список маршрутов:

symfony console debug:router
ИмяМетодПуть
app_helloGET/hello/{name}
api_helloGET/api/hello

Шаг 4 — шаблон Twig

templates/hello/index.html.twig:

{% extends 'base.html.twig' %}

{% block title %}Привет{% endblock %}

{% block body %}
<h1>Привет, {{ name|e }}!</h1>
<p>Маршрут: {{ path('app_hello', { name: name }) }}</p>
{% endblock %}
КонструкцияНазначение
{% extends %}Наследование layout из base.html.twig
{{ name|e }}Вывод с экранированием HTML (XSS)
{% block %}Переопределяемые области
path('app_hello', ...)URL по имени маршрута

Шаблонизаторы — Twig / Blade, HTML.


Шаг 5 — проверка

URLОжидаемый результат
/hello/WorldHTML "Привет, World!"
/hello/<script>Экранированный текст (без XSS)
/api/hello{"message":"Hello from Symfony API"}
curl -k https://127.0.0.1:8000/api/hello
curl -k https://127.0.0.1:8000/hello/ Symfony

Флаг -k — игнорировать self-signed сертификат локального сервера.


Шаг 6 — сервис и DI

Логику приветствия выносят в сервис — контроллер остаётся тонким.

src/Service/GreetingService.php:

<?php

namespace App\Service;

final class GreetingService
{
public function greet(string $name): string
{
$trimmed = trim($name);
return $trimmed === '' ? 'Гость' : $trimmed;
}

public function formatMessage(string $name): string
{
return sprintf('Привет, %s!', $this->greet($name));
}
}

Контроллер с внедрением зависимости:

final class HelloController extends AbstractController
{
public function __construct(
private readonly GreetingService $greetingService,
) {}

#[Route('/hello/{name}', name: 'app_hello', methods: ['GET'])]
public function hello(string $name): Response
{
return $this->render('hello/index.html.twig', [
'name' => $this->greetingService->greet($name),
]);
}
}

Symfony autowire создаст GreetingService и передаст в конструктор — см. ООП в PHP.

Проверка контейнера:

symfony console debug:container GreetingService
ПонятиеСмысл
ServiceКласс в src/, регистрируется автоматически
AutowireSymfony подставляет зависимости по типам
AutoconfigureТеги для event subscriber, command и т.д.

Шаг 7 — переменные окружения

.env (коммитится с placeholder-значениями):

APP_ENV=dev
APP_SECRET=change_me_in_production

Локальные секреты — .env.local.gitignore):

APP_SECRET=local_random_string_here

config/services.yaml по умолчанию включает autowire для всего src/. Секреты в prod — через реальные env на сервере, не в git.

Конфигурации.


Шаг 8 — форма POST (расширение)

Для закрепления данных со страницы добавьте Form Type:

symfony console make:form HelloType

Форма с CSRF защитой отправляет POST на тот же или отдельный маршрут. Symfony генерирует токен — без него форма отклоняется.


Типичные ошибки

СимптомПричинаРешение
404 на маршрутОпечатка в path или namespacedebug:router, класс в App\Controller
Twig not foundНеверный путь шаблонаtemplates/hello/index.html.twig
Class not foundAutoload не обновлёнcomposer dump-autoload
500 APP_SECRETПустой secret.env.local с APP_SECRET
Белый экран prodAPP_ENV=prod, cachesymfony console cache:clear
JSON без CORSБраузерный фронт на другом портуNelmioCorsBundle или proxy

Как превратить учебный проект в API-сервис

План эволюции

  1. Контроллеры + JSON ($this->json()).
  2. Doctrine + SQLite/PostgreSQL — 1432.
  3. Валидация входных DTO (Symfony Validator).
  4. Тесты PHPUnit + WebTestCase.
  5. Deploy за Nginx + PHP-FPM.

Базовые контракты API

ЭндпоинтУспехОшибка клиента
GET /api/hello200 + JSON405 неверный метод
POST /api/items201 + объект400 validation
GET /api/items/{id}200404

Связанные материалы

ТемаМатериал
Развёрнутая первая программа1441 + Lab play
Справочник Symfony1442
Doctrine / БД1432
Laravel (другой стиль)1431
WordPress (CMS)164
Практика

Добавьте Form Type с CSRF для POST /hello — закрепите данные со страницы и валидацию. Затем вынесите обработку в GreetingService и покройте unit-тестом.

Production

На боевом сервере — APP_ENV=prod, OPcache, HTTPS за reverse proxy, секреты только в env. Document root — только каталог public/.


Шаг 9 — кэш и окружения Symfony

symfony console cache:clear
symfony console cache:warmup
symfony console about
APP_ENVПоведение
devProfiler, подробные ошибки
prodКэш compiled, без debug
testPHPUnit, mock services

Переключение:

symfony console debug:config framework

Шаг 10 — PHPUnit smoke test

composer require --dev symfony/test-pack

tests/Controller/HelloControllerTest.php:

<?php

namespace App\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

final class HelloControllerTest extends WebTestCase
{
public function testApiHello(): void
{
$client = static::createClient();
$client->request('GET', '/api/hello');
self::assertResponseIsSuccessful();
self::assertJsonStringEqualsJsonString(
'{"message":"Hello from Symfony API"}',
$client->getResponse()->getContent()
);
}
}
symfony console phpunit
# или
./bin/phpunit

Маршрутизация YAML (альтернатива атрибутам)

config/routes.yaml:

controllers:
resource: ../src/Controller/
type: attribute

Legacy проекты могут использовать анnotations или YAML per route — атрибуты PHP 8 предпочтительны для новых контроллеров.


Event Subscriber (расширение)

<?php

namespace App\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;

final class RequestLogSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [KernelEvents::REQUEST => 'onRequest'];
}

public function onRequest(RequestEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}
// логирование URI — учебный пример
}
}

Autoconfigure регистрирует subscriber автоматически.


Навигация по блоку PHP / Symfony


Шаг 11 — валидация JSON API

composer require symfony/validator

DTO с constraints — 151 данные со страницы. Возвращайте 422 при validation errors через Problem+json или свой формат.


Шаг 12 — Makefile для команды

install:
composer install
symfony console cache:clear

test:
symfony console phpunit

serve:
symfony server:start

Шаг 13 — структура src для роста

src/
Controller/
Service/
Repository/
Entity/ # после Doctrine
DTO/

Thin controllers — логика в Service; persistence в Repository.


Symfony и Laravel — краткое сравнение

SymfonyLaravel
Философияcomponents, explicitconventions, batteries
ConfigYAML + PHP attributes.env + facades
Learningкруче для enterpriseбыстрее старт

Сравнение первых шагов — Laravel 1431.


Шаг 9 — консольные команды Symfony

Symfony CLI и bin/console — не только веб. Учебная команда приветствия:

symfony console make:command app:greet

src/Command/GreetCommand.php:

<?php

namespace App\Command;

use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(name: 'app:greet', description: 'Печатает приветствие')]
final class GreetCommand extends Command
{
protected function configure(): void
{
$this->addArgument('name', InputArgument::OPTIONAL, 'Имя', 'мир');
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$name = (string) $input->getArgument('name');
$output->writeln(sprintf('Привет, %s!', $name));
return Command::SUCCESS;
}
}

Запуск:

symfony console app:greet Symfony
symfony console list

Разбор:

  • #[AsCommand] регистрирует команду без ручного YAML.
  • Код возврата Command::SUCCESS — 0, ошибка — Command::FAILURE.
  • debug:container, cache:clear, router:match /hello/World — диагностика без браузера.

Шаг 10 — тесты WebTestCase

Установите тестовый пакет (если не в --webapp):

composer require --dev symfony/test-pack

tests/Controller/HelloControllerTest.php:

<?php

namespace App\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

final class HelloControllerTest extends WebTestCase
{
public function testApiHelloReturnsJson(): void
{
$client = static::createClient();
$client->request('GET', '/api/hello');

$this->assertResponseIsSuccessful();
$this->assertJson($client->getResponse()->getContent());
$data = json_decode($client->getResponse()->getContent(), true);
$this->assertSame('Hello from Symfony API', $data['message']);
}
}
symfony console doctrine:database:create --if-not-exists # если подключена БД
./vendor/bin/phpunit

WebTestCase поднимает kernel in-process — быстрее, чем curl в CI. Unit-тест GreetingService без HTTP — обычный PHPUnit с new GreetingService().


Шаг 11 — маршрутизация YAML и атрибуты

Два стиля сосуществуют. Атрибуты на классе (как выше) — предпочтительны в новых проектах. Альтернатива в config/routes.yaml:

controllers:
resource:
path: ../src/Controller/
namespace: App\Controller
type: attribute

Префикс API для группы контроллеров:

#[Route('/api', name: 'api_')]
final class NoteApiController extends AbstractController
{
#[Route('/notes', name: 'notes_list', methods: ['GET'])]
public function list(): JsonResponse
{
return $this->json(['items' => []]);
}
}

Имя маршрута api_notes_list — генерация URL в Twig: path('api_notes_list').


Шаг 12 — валидация входных данных

DTO с Symfony Validator:

<?php

namespace App\Dto;

use Symfony\Component\Validator\Constraints as Assert;

final class CreateNoteRequest
{
public function __construct(
#[Assert\NotBlank(message: 'text обязателен')]
#[Assert\Length(max: 500)]
public readonly string $text,
) {}
}

В контроллере — #[MapRequestPayload] (Symfony 6.3+) или ручной $validator->validate($dto). Ошибки — 422 Unprocessable Entity с массивом полей. Теория HTTP-кодов — REST API.


Работа в PhpStorm и VS Code

IDEНастройка
PhpStormOpen Directory, включить Symfony plugin, PHP 8.2 interpreter
VS CodePHP Intelephense + Symfony extension, path to php

Xdebug — breakpoint в HelloController::hello, запуск symfony server:start с XDEBUG_MODE=debug. Подробнее — отладка.


Symfony и Laravel — ориентиры выбора

КритерийSymfonyLaravel
ФилософияКомпоненты, явная конфигурацияConvention over configuration
ORMDoctrine (отдельная кривая)Eloquent (проще старт)
ЭкосистемаEnterprise EU, API PlatformСтартапы, быстрый MVP
ОбучениеБольше концепций сразуМеньше порог для CRUD

Оба — зрелые PHP-фреймворки. Symfony выбирают за модульность и долгоживущие enterprise-проекты; Laravel — за скорость прототипирования — Laravel 1431.


Расширенный troubleshooting

СимптомПричинаРешение
500 после deployНет composer install --no-devProd deps и APP_ENV=prod
Маршрут не в спискеКэш prodbin/console cache:clear --env=prod
Twig syntax errorНезакрытый blockПроверить {% endblock %}
CSRF invalidСессия истеклаОбновить страницу формы
Permission denied var/Права на cache/logschmod -R u+w var/ на сервере
Autowire failИнтерфейс без bindingЯвный alias в services.yaml

Логи: var/log/dev.log в dev, Monolog в prod — логирование.


Дополнительные упражнения

  1. Добавьте POST /api/notes с валидацией CreateNoteRequest и ответом 201.
  2. Напишите GreetingServiceTest — unit без kernel.
  3. Создайте app:notes:export — вывод списка заметок в JSON в stdout.
  4. Подключите nelmio/api-doc-bundle — Swagger UI для API.
  5. Docker Compose: PHP-FPM + Nginx + PostgreSQL — healthcheck на /api/hello.

Расширенный FAQ

Нужен ли Apache?

Нет. symfony server или Nginx + PHP-FPM достаточно. Document root — только public/.

Можно ли API без Twig?

Да. Создайте проект --version=7.0 с минимальным набором или удалите Twig — останутся контроллеры и JSON.

Где Doctrine?

Отдельная глава 1432. Для первой программы достаточно in-memory или SQLite.

Symfony Flex что делает?

Recipes автоматически добавляют конфиг при composer require — не пугайтесь новых файлов в config/.

Как версионировать API?

Префикс /api/v1/ в #[Route] или отдельный namespace контроллеров.



FAQ — полный список

1. Нужен ли Apache?

symfony server или Nginx + PHP-FPM. Document root — public/.

2. API без Twig?

Да — минимальный набор или только JSON controllers.

3. Doctrine где?

1432. Для первой программы — in-memory или SQLite.

4. Symfony Flex?

Recipes при composer require — автоконfig.

5. Версионирование API?

Префикс /api/v1/ в Route.

6. APP_SECRET?

.env.local — не в git.

7. Autowire fail?

Явный alias в services.yaml для интерфейсов.

8. WebTestCase vs unit?

WebTestCase — HTTP in-process. Unit — без kernel.

9. Laravel или Symfony?

Symfony — enterprise модульность. Laravel — быстрый MVP 1431.

10. Form CSRF?

Symfony генерирует токен автоматически.

11. Xdebug?

Отладка.

12. Production cache?

APP_ENV=prod, cache:clear, OPcache.

13. CORS для SPA?

NelmioCorsBundle или proxy.

14. make:command?

Консольные задачи через bin/console.

15. Validator DTO?

MapRequestPayload или ручной validate — 422.

16. WordPress рядом?

CMS vs framework — 164.

17. HTTP коды?

REST API.

Упражнения — расширенный набор

  1. POST /api/notes с CreateNoteRequest и 201.
  2. GreetingServiceTest unit.
  3. app:notes:export command.
  4. Swagger nelmio/api-doc-bundle.
  5. Docker Compose PHP-FPM + Nginx + PostgreSQL.
  6. Form Type с CSRF POST /hello.
  7. debug:router и router:match.
  8. PHPUnit WebTestCase api/hello.
  9. GreetingService в DI — debug:container.
  10. Production checklist в README.

Практикум — дополнительный блок 1 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 1
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 1

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 1"

Практикум — дополнительный блок 2 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 2
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 2

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 2"

Практикум — дополнительный блок 3 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 3
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 3

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 3"

Практикум — дополнительный блок 4 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 4
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 4

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 4"

Практикум — дополнительный блок 5 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 5
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 5

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 5"

Практикум — дополнительный блок 6 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 6
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 6

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 6"

Практикум — дополнительный блок 7 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 7
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 7

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 7"

Практикум — дополнительный блок 8 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 8
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 8

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 8"

Практикум — дополнительный блок 9 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 9
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 9

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 9"

Практикум — дополнительный блок 10 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 10
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 10

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 10"

Практикум — дополнительный блок 11 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 11
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 11

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 11"

Практикум — дополнительный блок 12 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 12
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 12

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 12"

Практикум — дополнительный блок 13 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 13
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 13

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 13"

Практикум — дополнительный блок 14 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 14
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 14

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 14"

Практикум — дополнительный блок 15 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 15
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 15

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 15"

Практикум — дополнительный блок 16 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 16
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 16

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 16"

Практикум — дополнительный блок 17 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 17
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 17

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 17"

Практикум — дополнительный блок 18 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 18
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 18

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 18"

Практикум — дополнительный блок 19 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 19
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 19

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 19"

Практикум — дополнительный блок 20 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 20
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 20

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 20"

Практикум — дополнительный блок 21 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 21
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 21

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 21"

Практикум — дополнительный блок 22 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 22
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 22

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 22"

Практикум — дополнительный блок 23 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 23
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 23

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 23"

Практикум — дополнительный блок 24 (163)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 24
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 24

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (163)
echo "Smoke block 24"
Содержание