В этом руководстве я покажу вам, как настроить полноценную локальную среду с Nginx, MySql и Symfony всего за несколько минут. Более того, файл, о котором здесь пойдет речь, я сам использую для каждого проекта, над которым я начинаю работать. Начнем же с простого вопроса: сколько времени занимает создание сайта? Чтобы ответить на этот вопрос, позвольте мне рассказать вам одну историю. Много лет назад я жил в маленькой деревушке на окраине Лондона (Великобритания). Почти каждый вечер после работы я поднимался на холмы за пределами центра города, чтобы посмотреть на свет лондонских небоскребов. Я  мечтал работать веб-разработчиком в одном из этих зданий. Чтобы добиться этого я поставил себе две задачи: улучшить свои навыки и, как следствие, мое резюме; продемонстрировать свои навыки, создав новый сайт в качестве портфолио; Этот план сработал очень хорошо, и ровно через 12 месяцев я уже жил и работал в самом центре Лондона. С тех пор изменилось многое. Я получил новую работу, приобрел другие навыки и завел много связей в этой области. Однако все это время кое-что оставалось неизменным. Мой сайт не изменялся с тех самых пор. Прошло целых пять лет, и я, наконец, решил обновить свой личный сайт. Сделаю я это с применением Symfony 6 и Docker. Что, вы тоже хотите попробовать? Нет ничего проще! Я подробно все объясню в этой статье. Сразу оговорюсь, что эта статья не о том, что из себя представляют PHP-фреймворки в целом и Symfony в частности. Я уже писал, что это такое и почему Symfony 6 идеально подходит для вашего следующего проекта. Но если в двух словах, Symfony — один из самых популярных PHP-фреймворков, доступных в настоящее время. Это набор компонентов, хорошо собранных вместе, нацеленных облегчить жизнь разработчика. Не говоря уже о том, что проект на нем работает быстрее и с меньшим количеством головной боли. Вторая важная составляющая проекта — наличие Docker. О нем я тоже уже писал в прошлом. Вот статья, которая показывает, как контейнеризировать ваше PHP-приложение с помощью Docker. В двух словах, Docker — это платформа, которая помогает разработчикам собирать и запускать приложения. Контейнеры представляют наборы процессов, изолированных от основной операционной системы. На основе этих контейнеровы вы можете создавать целые проекты. Это очень удобно. Почему? Потому что теперь ваш ноутбук дома и компьютер в офисе будут “загружать” один и тот же контейнер. Наличие такого контейнера избавит вас от множества хлопот и проблем при работе над вашим проектом. Symfony — это PHP-фреймворк, так что нам нужен сервер, на котором может работать PHP. Не будем забывать, что нам также нужен какой-либо способ хранить данные. Это означает, что нам нужна база данных. Нужно ли нам устанавливать все это? Никак нет! Единственное, что нам нужно, это Docker. Он позаботится о том, чтобы подтянуть все остальное. Если вы хотите сохранить ваш проект или обновить его в будущем, вы можете добавить к нему контроль версий. С этим отлично справится GIT. Настало время настроить проект. Давайте же начнем! Docker — идеальный инструмент, который можно достать из рукава в любой ситуации, когда вам нужно задействовать какой-то конкретный процесс. При создании многоконтейнерного приложения, подобного тому, которое мы собираемся реализовать в этой статье, нам понадобится еще один инструмент. Compose — это инструмент, который определяет и запускает многоконтейнерные Docker приложения. Эти контейнеры определяются через YAML-файл с именем docker-compose. Вот ссылка на полную документацию по Compose, ну а я обращу ваше внимание на то, что этот файл может иметь один или несколько ключей. Мы собираемся использовать три из них, а именно: version указывает версию файла docker-compose. Это позволяет Docker понять, что он должен делать; networks определяет отношения между сервисами. Так мы указываем, какие из них связаны друг с другом; service перечисляет все контейнеры, необходимые данному проекту. Здесь мы также предоставляем подробную информацию о том, как эти сервисы должны запускаться; Для реализации нашего проекта нужно три разных сервиса. Первый — это сервер, на котором будет запущено наше приложение. Затем нам нужно добавить PHP. Указываем, какую версию мы хотим. Нам также нужна база данных, в которой хранятся наши данные. Все эти сервисы будут связаны друг с другом. Это означает, что я должен создать сеть, которая свяжет их вместе. Вот как будет выглядеть этот файл в итоге: Учитывая количество элементов, которые могут быть в этом файле, здесь я не буду на них останавливаться.  Учитывая, что высокоуровневые элементы наших сервисов уже установлены, пришло время углубиться в детали. Начнем с конфигурации нашего сервера. Наш файл docker-compose указывает, что конфигурация будет находиться внутри папки Nginx. Давайте создадим default.conf и добавим в него кое-что. Я не являюсь экспертом по настройке серверов, к слову, мне это не и нужно, поскольку Symfony предоставляет несколько готовых конфигураций сервера в зависимости от наших потребностей. Заходим на официальную страницу конфигурации Nginx Symfony и копируем то, что нам нужно. Вы могли заметить, что я добавил несколько новых полей. Эти изменения связаны с файлом docker-composer, который мы обновили ранее. Мы хотим прослушивать порт 80, который связан с портом 8080 в нашем контейнере Nginx. Кроме того, я изменил server_name на localhost, чтобы немного упростить наш пример. Мы используем имя сервиса PHP в качестве значения поля fastcgi_pass. И последнее, что касается ошибок 502. У Nginx есть плохая привычка наслаиваться на Symfony, что усложняет отладку. Чтобы решить эту проблему, нам нужно увеличить размер буфера FastCGI. Существует разница между тем, как мы извлекаем контейнер сервера, и тем, как мы обновляем контейнер PHP. Вместо извлечения образа из DockerHub PHP использует Dockerfile. В этом есть много преимуществ. Одним из наиболее важных является то, что мы можем персонализировать то, как мы хотим, чтобы PHP работал. Давайте создадим папку PHP в корне нашего проекта и добавим в нее докерфайл. Первая задача, которую выполняет этот файл, — получение образа PHP 8.1. Если вы еще не очень хорошо в этом разбираетесь и хотите узнать больше, вот учебник по основам PHP. Затем этот файл запускает серию команд, которые устанавливают расширения, запускают базу данных, PDO и т.д. Он подготавливает рабочий каталог и устанавливает composer и интерфейс командной строки Symfony. Нам нужно всего 15 строк, чтобы все это реализовать. Сервис базы данных работает аналогично PHP. Я показывал вам файл docker-compose выше. Давайте же теперь пройдемся по полям и разберем некоторые детали. В нашем случае мы будем использовать готовый образ. Это будет MySQL с тегом 8. Поле портов указывает, какой порт необходим для связи между сервисом и хостом. В нашем случае это будет порт 4306. Официальная документация говорит нам, что нам нужно добавить еще три поля: В первом файл перечисляет ряд сведений о базе данных. Restart указывает, что Docker должен делать в случае сбоя. В данном случае мы хотим, чтобы MySQL всегда автоматически перезапускался. Environment содержит массив элементов, которые мы используем для добавления учетных данных пользователя. Наконец, том (volume) будет создан из var/lib/mysql в каталог /mysql. Mysql является частью сети. Сейчас нам не нужно обновлять какую-либо конфигурацию базы данных. Теперь, когда все настроено, пора приступать к интересной части. Я собираюсь показать вам в чем тут вся суть и как заставить этот проект работать. Первым делом начнем с сервера. Как вы можете видеть, том проекта указывает путь /var/www/project. В файле конфигурации Nginx в корне у нас есть папка public, внутри которой находится индексный файл под названием index.php. Что нам нужно сделать, так это добавить эту папку и этот файл в каталог нашего приложения. Там мы можем просто вывести сообщение ‘Hello world! ‘, показывающее, что сервер работает правильно. Последний шаг — создать эти образы и запустить сервисы. Docker позволяет нам сделать это с помощью одной команды, которая выглядит следующим образом: Она развернет образы, извлечет все необходимое из Docker Hub и покажет URL локального хоста, который мы сможем использовать для просмотра нашего сообщения. До сих пор мы лишь настраивали контейнеры, чтобы наш проект работал. С этого момента мы начинаем фактическую работу над веб-частью проекта. Настало время устанавливать Symfony на сервер и запускать нашу IDE. Для начала мы собираемся удалить папку. В настоящее время внутри нашего каталога приложений есть папка public. Единственной целью этой папки было проверить, работает ли наш сервер. Теперь, когда мы убедились, что все работает, нам больше не нужен index.php. С помощью нашей первой команды нам нужно попасть внутрь контейнера PHP. Мы можем сделать это, набрав в терминале следующее: Эта команда позволяет попасть в терминал или в наш PHP-контейнер. Оказавшись внутри, мы можем подтянуть и создать наш проект Symfony. Теперь все новые файлы должны быть в папке app. Если вы зайдете в свой браузер, вы сможете увидеть главную страницу Symfony. Теперь, когда мы установили наше веб-приложение, мы можем приступить к важынм деталям. Прежде всего, я хочу показать вам gitignore.io. Это приложение позволяет создавать файлы gitignore, вводя немного информации для контекста. Речь идет о такой информации, как над какой SO вы работаете, язык программирования по вашему выбору и используемая IDE. При нажатии кнопки “Create” будет создан файл gitignore. Вот его пример: Последнее, что нам осталось сделать перед тем, как я закончу эту статью, — настроить базу данных и установить ORM. ORM позволяет вам делать запросы и извлекать записи в виде объектов ООП. Это идеально нам подходит, потому что мы получаем возможность манипулировать результатом так, как мы хотим. Чтобы добавить доктрину в наш проект, нам нужно запросить ее через composer. В командной строке PHP введите следующее: Мы можем использовать ключевое слово doctrine только потому, что используем Symfony flex, чтобы скачать рецепты. На самом деле, что Symfony делает под капотом, так это извлекает пакет с именем symfony/orm-pack, который содержит весь необходимый код. Еще один шаг, который на осталось сделать, — это детали подключения к базе данных. Мы делаем это, обновляя env-файл в корне нашего PHP-проекта. Поле, которое нам нужно обновить, это DATABASE_URL. Это строка, которая должна содержать все учетные данные нашей базы данных. Пришло время создать нашу базу данных. И это тоже можно сделать с помощью всего одной простой команды. Введите в терминале exit, чтобы остановить bash, и запустите команду доктрины. Symfony — отличный инструмент для создания веб-приложений. В сочетании с мощью Docker разработка любого проекта станет намного проще и приятнее. Это может казаться сложным поначалу, но если вы будете следовать моему пошаговому руководству, я уверен, что вы не столкнетесь с какими-либо трудностями. Вы на своем опыте убедитесь, как легко запустить этот проект. На днях прошел открытый урок «Обновление до php 8.1 с помощью rector», в рамках которого мы: применили rector к коду на php 8 для автоматического использования возможностей 8.1, обсудили наюнсы перехода с myclabs/php-enum на built-in enum, определили readonly-свойства и их влияние на тесты. Запись урока можно посмотреть на странице онлайн-курса "Symfony Framework".  Редактор