Создание шаблона приложений Symfony 7 с помощью FrankenPHP, Docker, PostgreSQL и php 8.4
В статье рассказывается, как создать универсальный шаблон для запуска проектов на Symfony, таких как монолитные приложения или API. Основой является сервер приложений FrankenPHP, написанный на Go, с использованием PostgreSQL в качестве реляционной базы данных. Для организации работы контейнеров используется Docker и Compose.
Основные этапы разработки:
1. Организация структуры проекта
Проект имеет простую структуру: одна папка для файлов Docker и другая для исходного кода Symfony. Основной файл конфигурации
🔸База данных PostgreSQL.
🔸Приложение Symfony, использующее FrankenPHP.
2. Настройка окружения для разработки
Для разработки создается файл
3. Создание Dockerfile для приложения
Dockerfile имеет несколько стадий:
🔹Базовый образ на основе Debian Bookworm и FrankenPHP.
🔹Разработка: включает зависимости, такие как Xdebug, и файлы конфигурации для разработки.
🔹Продакшн: оптимизированный образ с использованием OPcache и минимизацией зависимостей.
4. Автоматизация процессов с помощью Composer
Composer используется не только для управления зависимостями, но и для выполнения скриптов, таких как установка контейнеров, миграция базы данных, загрузка фикстур и многое другое.
5. Конфигурация FrankenPHP
FrankenPHP работает через прокси-сервер Caddy. Используются конфигурации, рекомендованные в официальной документации, с возможностью настройки количества рабочих процессов и режима работы.
6. Symfony и дополнительные инструменты
Установлены зависимости, обеспечивающие высококлассный опыт разработки, включая Code Sniffer, phpstan, Rector, а также пакеты Symfony, такие как Doctrine ORM, Twig и инструменты для тестирования.
7. Оптимизация для продакшна
Для продакшна предусмотрена отдельная стадия сборки, где уменьшается нагрузка за счет использования OPcache и других оптимизаций. Создается файл
В статье рассказывается, как создать универсальный шаблон для запуска проектов на Symfony, таких как монолитные приложения или API. Основой является сервер приложений FrankenPHP, написанный на Go, с использованием PostgreSQL в качестве реляционной базы данных. Для организации работы контейнеров используется Docker и Compose.
Основные этапы разработки:
1. Организация структуры проекта
Проект имеет простую структуру: одна папка для файлов Docker и другая для исходного кода Symfony. Основной файл конфигурации
compose.yml
размещается в корне проекта. Он описывает два основных контейнера:🔸База данных PostgreSQL.
🔸Приложение Symfony, использующее FrankenPHP.
2. Настройка окружения для разработки
Для разработки создается файл
compose.override.yml
, позволяющий настраивать дополнительные порты, монтировать директории и включать Xdebug. Это упрощает отладку и разработку.3. Создание Dockerfile для приложения
Dockerfile имеет несколько стадий:
🔹Базовый образ на основе Debian Bookworm и FrankenPHP.
🔹Разработка: включает зависимости, такие как Xdebug, и файлы конфигурации для разработки.
🔹Продакшн: оптимизированный образ с использованием OPcache и минимизацией зависимостей.
4. Автоматизация процессов с помощью Composer
Composer используется не только для управления зависимостями, но и для выполнения скриптов, таких как установка контейнеров, миграция базы данных, загрузка фикстур и многое другое.
5. Конфигурация FrankenPHP
FrankenPHP работает через прокси-сервер Caddy. Используются конфигурации, рекомендованные в официальной документации, с возможностью настройки количества рабочих процессов и режима работы.
6. Symfony и дополнительные инструменты
Установлены зависимости, обеспечивающие высококлассный опыт разработки, включая Code Sniffer, phpstan, Rector, а также пакеты Symfony, такие как Doctrine ORM, Twig и инструменты для тестирования.
7. Оптимизация для продакшна
Для продакшна предусмотрена отдельная стадия сборки, где уменьшается нагрузка за счет использования OPcache и других оптимизаций. Создается файл
composer.override.prod.yml
, описывающий настройки для продакшн-окружения.👍10
⚙️ Подпишись на нашу еженедельную email-рассылку, чтобы быть в курсе последних открытий и тенденций в мире бэкенда.
В еженедельных письмах ты найдешь:
● Языки программирования и фреймворки для бэкенда
● Архитектура и проектирование серверных приложений
● Базы данных и управление данными
● Безопасность и защита данных
● Облачные технологии и DevOps
● API и интеграции
● Тестирование и отладка
● Инструменты и утилиты для бэкенд-разработчиков
● Лучшие практики и паттерны проектирования
👉Подписаться👈
В еженедельных письмах ты найдешь:
● Языки программирования и фреймворки для бэкенда
● Архитектура и проектирование серверных приложений
● Базы данных и управление данными
● Безопасность и защита данных
● Облачные технологии и DevOps
● API и интеграции
● Тестирование и отладка
● Инструменты и утилиты для бэкенд-разработчиков
● Лучшие практики и паттерны проектирования
👉Подписаться👈
Моки — это инструмент для тестирования поведения объектов в изолированных условиях. Они позволяют заменить реальные зависимости на их имитацию, чтобы избежать обращения к внешним ресурсам, которые могут замедлить выполнение тестов.
Зачем нужны моки
Основная задача моков — проверять взаимодействие между объектами. Это достигается за счёт возможности задать ожидаемое поведение и проверить, насколько реальные вызовы совпадают с этими ожиданиями. Например, можно проверить, сколько раз вызывается метод и с какими параметрами.
Типичные ошибки при использовании моков
1. Отсутствие ожиданий
Если задать только возвращаемое значение без проверки взаимодействий, тест может не обнаружить проблемы.
✅ Правильный подход: указывать, какие методы должны вызываться и с какими параметрами.
2. Мокирование конкретных классов вместо интерфейсов
Моки лучше создавать на основе интерфейсов, так как они реже меняются, чем реализации.
3. Чрезмерное использование моков
Излишнее мокирование усложняет тесты и может указывать на проблемы с проектированием.
4 .Маскировка плохого дизайна
Если моки используются для тестирования тесно связанных компонентов, это может быть признаком нарушения принципа разделения ответственности.
5. Полная зависимость от моков
Хотя моки полезны, они не заменяют другие виды тестов, такие как интеграционные или end-to-end тесты.
Как распознать неправильное использование моков
🔸Тесты не отражают реальные сценарии, что приводит к игнорированию критичных ошибок в продакшене.
🔸Тесты слишком сильно связаны с реализацией, из-за чего частое обновление моков становится необходимостью.
🔸Чрезмерная сложность тестов делает их трудными для чтения и поддержки.
Зачем нужны моки
Основная задача моков — проверять взаимодействие между объектами. Это достигается за счёт возможности задать ожидаемое поведение и проверить, насколько реальные вызовы совпадают с этими ожиданиями. Например, можно проверить, сколько раз вызывается метод и с какими параметрами.
Типичные ошибки при использовании моков
1. Отсутствие ожиданий
Если задать только возвращаемое значение без проверки взаимодействий, тест может не обнаружить проблемы.
✅ Правильный подход: указывать, какие методы должны вызываться и с какими параметрами.
2. Мокирование конкретных классов вместо интерфейсов
Моки лучше создавать на основе интерфейсов, так как они реже меняются, чем реализации.
3. Чрезмерное использование моков
Излишнее мокирование усложняет тесты и может указывать на проблемы с проектированием.
4 .Маскировка плохого дизайна
Если моки используются для тестирования тесно связанных компонентов, это может быть признаком нарушения принципа разделения ответственности.
5. Полная зависимость от моков
Хотя моки полезны, они не заменяют другие виды тестов, такие как интеграционные или end-to-end тесты.
Как распознать неправильное использование моков
🔸Тесты не отражают реальные сценарии, что приводит к игнорированию критичных ошибок в продакшене.
🔸Тесты слишком сильно связаны с реализацией, из-за чего частое обновление моков становится необходимостью.
🔸Чрезмерная сложность тестов делает их трудными для чтения и поддержки.
👍3🤔1👾1
Выжимаем максимум скорости из PHP
При запуске PHP-приложений крайне важно правильно выбрать веб-сервер. Чтобы объективно оценить производительность популярных решений, было проведено тестирование не на искусственных данных, а на реальных примерах. Цель исследования заключалась не в создании рейтинга веб-серверов для PHP-приложений. Была цель показать, в каких условиях каждый сервер сможет продемонстрировать наилучшие результаты.
При запуске PHP-приложений крайне важно правильно выбрать веб-сервер. Чтобы объективно оценить производительность популярных решений, было проведено тестирование не на искусственных данных, а на реальных примерах. Цель исследования заключалась не в создании рейтинга веб-серверов для PHP-приложений. Была цель показать, в каких условиях каждый сервер сможет продемонстрировать наилучшие результаты.
Хабр
Выжимаем максимум скорости из PHP
При запуске PHP-приложений крайне важно правильно выбрать веб-сервер. Чтобы объективно оценить производительность популярных решений, мы проводили тестирование не на искусственных данных, а на...
🔥10🥱2❤1
Как работает HTTP Kernel в Symfony?
HTTP Kernel (HTTP ядро) в Symfony — это ключевой компонент фреймворка, отвечающий за обработку HTTP-запросов и формирование ответов. Он реализует шаблон проектирования Front Controller и координирует весь жизненный цикл запроса и ответа.
Основной процесс работы HTTP Kernel
1. Получение запроса:
Входной файл (index.php) получает HTTP-запрос и передаёт его в ядро.
2. Маршрутизация:
Ядро использует компонент маршрутизации, чтобы определить, какой маршрут соответствует запросу, и какой контроллер должен быть вызван.
3. Вызов контроллера:
После определения маршрута вызывается соответствующий контроллер, который обрабатывает запрос и возвращает данные.
4. Формирование ответа:
Контроллер возвращает объект ответа, который может быть модифицирован дополнительными обработчиками (например, добавление заголовков).
5. Отправка ответа:
HTTP ядро отправляет готовый ответ обратно клиенту.
6. Постобработка:
После отправки ответа запускаются задачи, которые можно выполнять асинхронно (например, логирование или очистка данных).
Основные компоненты
🔹 Запрос и ответ:
Symfony использует объект запроса, который содержит все данные HTTP-запроса (заголовки, параметры, тело и т.д.), и объект ответа, который формирует конечный HTTP-ответ.
🔹 Маршрутизация:
Компонент маршрутизации сопоставляет URL запроса с маршрутами, указанными в конфигурации, и определяет, какой контроллер и параметры использовать.
🔹 Контроллер:
Контроллер — это метод, который выполняет бизнес-логику, принимает параметры из запроса и возвращает ответ.
🔹 События:
Во время обработки запроса ядро генерирует события, на которые могут подписываться обработчики. Это позволяет изменять запрос, контроллер или ответ на разных этапах обработки.
🔹 Постобработка:
После того как ответ отправлен клиенту, могут выполняться задачи, которые не требуют немедленного завершения (например, отправка логов или очистка кэша).
Этапы обработки запроса
✔️Клиент отправляет HTTP-запрос.
✔️Ядро принимает запрос и вызывает маршрутизацию.
✔️Контроллер выполняет бизнес-логику.
✔️Генерируется HTTP-ответ.
✔️Ответ модифицируется при необходимости (например, добавляются заголовки).
✔️Готовый ответ отправляется клиенту.
✔️Выполняются завершающие задачи.
#вопросы_с_собеседований
HTTP Kernel (HTTP ядро) в Symfony — это ключевой компонент фреймворка, отвечающий за обработку HTTP-запросов и формирование ответов. Он реализует шаблон проектирования Front Controller и координирует весь жизненный цикл запроса и ответа.
Основной процесс работы HTTP Kernel
1. Получение запроса:
Входной файл (index.php) получает HTTP-запрос и передаёт его в ядро.
2. Маршрутизация:
Ядро использует компонент маршрутизации, чтобы определить, какой маршрут соответствует запросу, и какой контроллер должен быть вызван.
3. Вызов контроллера:
После определения маршрута вызывается соответствующий контроллер, который обрабатывает запрос и возвращает данные.
4. Формирование ответа:
Контроллер возвращает объект ответа, который может быть модифицирован дополнительными обработчиками (например, добавление заголовков).
5. Отправка ответа:
HTTP ядро отправляет готовый ответ обратно клиенту.
6. Постобработка:
После отправки ответа запускаются задачи, которые можно выполнять асинхронно (например, логирование или очистка данных).
Основные компоненты
🔹 Запрос и ответ:
Symfony использует объект запроса, который содержит все данные HTTP-запроса (заголовки, параметры, тело и т.д.), и объект ответа, который формирует конечный HTTP-ответ.
🔹 Маршрутизация:
Компонент маршрутизации сопоставляет URL запроса с маршрутами, указанными в конфигурации, и определяет, какой контроллер и параметры использовать.
🔹 Контроллер:
Контроллер — это метод, который выполняет бизнес-логику, принимает параметры из запроса и возвращает ответ.
🔹 События:
Во время обработки запроса ядро генерирует события, на которые могут подписываться обработчики. Это позволяет изменять запрос, контроллер или ответ на разных этапах обработки.
🔹 Постобработка:
После того как ответ отправлен клиенту, могут выполняться задачи, которые не требуют немедленного завершения (например, отправка логов или очистка кэша).
Этапы обработки запроса
✔️Клиент отправляет HTTP-запрос.
✔️Ядро принимает запрос и вызывает маршрутизацию.
✔️Контроллер выполняет бизнес-логику.
✔️Генерируется HTTP-ответ.
✔️Ответ модифицируется при необходимости (например, добавляются заголовки).
✔️Готовый ответ отправляется клиенту.
✔️Выполняются завершающие задачи.
#вопросы_с_собеседований
👍10🥰3❤1
Почему вам стоит задуматься о переходе на PHP 8.4?
В этой статье на медиуме рассматриваются основные причины, по которым вы можете захотеть обновить свои PHP-проекты до версии 8.4.
В этой статье на медиуме рассматриваются основные причины, по которым вы можете захотеть обновить свои PHP-проекты до версии 8.4.
Medium
Why You Should Consider Upgrading to PHP 8.4?
I think 8.4 is a good state of static type and other function really can do something more than a just a normal upgrade. In this article…
👍5
«Наконец я попробовал Pest для PHP и Laravel, а затем перешел на него.»
Pest — это современный инструмент для тестирования в PHP, созданный в 2021 году Нуну Мадуро, инженером Laravel. Pest быстро стал популярным благодаря своей интеграции с экосистемой Laravel и упрощению процесса тестирования. Основанный на PHPUnit, Pest сохраняет его мощь, но добавляет более удобный и лаконичный синтаксис.
Основное отличие Pest — это использование замыканий вместо классов для определения тестов. Такой подход делает код компактнее и проще для восприятия. Например, тест, проверяющий истинность условия, в Pest выглядит как одна строка, а не как целый класс, что ускоряет разработку и облегчает чтение кода.
Важной частью успеха Pest стала его привлекательная консоль, которая предоставляет четкий и понятный вывод тестов. Pest также поддерживает большинство возможностей PHPUnit, включая провайдеры данных, хуки (аналог
🔧 Тестирование архитектуры. Позволяет задавать архитектурные правила для кода, например, обязательное использование строгого режима.
📸 Снапшоты. Удобны для проверки неизменности данных.
🚀 Стресс-тестирование. Полезно для проверки производительности приложений.
🛠️ Плагины. Pest активно поддерживает расширяемость, что позволяет добавлять новые функции через сторонние модули.
Эволюция Pest связана с его глубокой интеграцией в Laravel-сообщество. Многие популярные проекты, такие как Spatie, Livewire и Filament, перешли на Pest, что сделало его стандартом де-факто в экосистеме Laravel. Благодаря обратной совместимости с PHPUnit, переход на Pest не требует кардинального изменения существующих тестов, что облегчает его внедрение.
Таким образом, Pest стал не просто альтернативой PHPUnit, а его современной интерпретацией с улучшенным синтаксисом и расширенными возможностями. Если вы разрабатываете на PHP и еще не пробовали Pest, его простота и мощь делают его достойным внимания инструментом.
Pest — это современный инструмент для тестирования в PHP, созданный в 2021 году Нуну Мадуро, инженером Laravel. Pest быстро стал популярным благодаря своей интеграции с экосистемой Laravel и упрощению процесса тестирования. Основанный на PHPUnit, Pest сохраняет его мощь, но добавляет более удобный и лаконичный синтаксис.
Основное отличие Pest — это использование замыканий вместо классов для определения тестов. Такой подход делает код компактнее и проще для восприятия. Например, тест, проверяющий истинность условия, в Pest выглядит как одна строка, а не как целый класс, что ускоряет разработку и облегчает чтение кода.
Важной частью успеха Pest стала его привлекательная консоль, которая предоставляет четкий и понятный вывод тестов. Pest также поддерживает большинство возможностей PHPUnit, включая провайдеры данных, хуки (аналог
setUp
и tearDown
), фильтрацию и группировку тестов. Однако Pest пошел дальше, предложив функции, которые делают его уникальным:🔧 Тестирование архитектуры. Позволяет задавать архитектурные правила для кода, например, обязательное использование строгого режима.
📸 Снапшоты. Удобны для проверки неизменности данных.
🚀 Стресс-тестирование. Полезно для проверки производительности приложений.
🛠️ Плагины. Pest активно поддерживает расширяемость, что позволяет добавлять новые функции через сторонние модули.
Эволюция Pest связана с его глубокой интеграцией в Laravel-сообщество. Многие популярные проекты, такие как Spatie, Livewire и Filament, перешли на Pest, что сделало его стандартом де-факто в экосистеме Laravel. Благодаря обратной совместимости с PHPUnit, переход на Pest не требует кардинального изменения существующих тестов, что облегчает его внедрение.
Таким образом, Pest стал не просто альтернативой PHPUnit, а его современной интерпретацией с улучшенным синтаксисом и расширенными возможностями. Если вы разрабатываете на PHP и еще не пробовали Pest, его простота и мощь делают его достойным внимания инструментом.
👍15😁7❤5🌚1
Ваш возраст
Anonymous Poll
1%
Менее 18 лет
12%
18-24 года
42%
25-34 года
35%
35-44 года
6%
45-54 года
1%
55-64 года
3%
65 лет и старше
🌚1
В какой стране вы живете последние 3 месяца?
Anonymous Poll
59%
Россия
10%
Украина
6%
Беларусь
4%
Казахстан
1%
Польша
1%
Кыргызстан
5%
Узбекистан
1%
США
1%
Грузия
11%
Другое (✏️ напишу в комментариях)
🔥1🌚1👾1
В каком городе вы живёте последние 3 месяца?
Anonymous Poll
14%
Москва
7%
Санкт-Петербург
3%
Екатеринбург
4%
Краснодар
2%
Нижний Новгород
5%
Минск
5%
Киев
1%
Львов
2%
Алматы
57%
Другое (✏️ напишу в комментариях)
🌚3👍1
Какой у вас коммерческий опыт работы в IT?
Anonymous Poll
7%
Нет опыта
6%
До 1 года
15%
1-3 года включительно
27%
3-6 лет включительно
44%
Более 6 лет
🌚1
😁2🌚2
Ваш доход в месяц после вычета налогов
Anonymous Poll
10%
До 500$
8%
От 501$ до 800$
12%
От 801$ до 1100$
23%
От 1101$ до 2000$
19%
От 2001$ до 3000$
12%
От 3001$ до 4000$
6%
От 4001$ до 5000$
3%
От 5001$ до 6000$
7%
От 6001$
🌚1
В какой компании вы работаете?
Anonymous Poll
10%
Стартап
54%
Средний бизнес
26%
Крупная корпорация
10%
Фриланс
🌚2
Какая у вас специализация в IT?
Anonymous Poll
66%
Backend
1%
Frontend
27%
Fullstack
0%
Mobile
0%
Desktop
0%
QA
1%
DevOps/Sysadmin
0%
Data Science
1%
Кибербезопасность
3%
Другое (✏️ напишу в комментариях)
🌚1
Какой грейд у вас на работе?
Anonymous Poll
3%
Стажёр
13%
Джуниор
36%
Миддл
24%
Сеньор
11%
Тимлид
2%
Архитектор
4%
СТО
6%
Я не айтишник
🌚2