Создание и запуск проекта Symfony
ServBay — это локальная среда разработки веб-приложений, специально созданная для macOS и Windows. Она интегрирует среды выполнения PHP, Node.js, Python, Go, Java, а также такие базы данных, как MySQL, PostgreSQL, MongoDB, Redis, и поддерживает веб-серверы Apache и Caddy. В этом руководстве подробно объясняется, как быстро развернуть и запустить Symfony-проект с помощью ServBay на macOS и Windows.
Что такое Symfony?
Symfony — это открытый PHP-фреймворк, разработанный SensioLabs. Он предоставляет разработчикам мощный, гибкий и эффективный набор инструментов для создания современных веб-приложений и API. Следует устоявшимся лучшим практикам веб-разработки и включает обширные функциональные компоненты: маршрутизацию, шаблонизатор (Twig), обработку форм, аутентификацию, внедрение зависимостей и многое другое — что значительно упрощает типичные задачи веб-разработки.
Основные возможности и преимущества Symfony
- Модульный дизайн: Symfony построен на переиспользуемых компонентах. Разработчик выбирает и использует только нужные, проектируя как легковесные, так и крупные приложения.
- Высокая производительность: Благодаря оптимальной архитектуре, кешированию и поддержке последних возможностей PHP, Symfony обеспечивает отличную скорость работы.
- Мощное сообщество: Большая база разработчиков, множество сторонних плагинов (Bundles) и подробная документация — найти решение на любой технический вопрос легко.
- Гибкость: Простая интеграция сторонних библиотек и расширений, подходит для проектов разного масштаба и сложности.
- Стабильность и удобство поддержки: Соблюдение лучших стандартов кодирования и паттернов проектирования гарантирует удобное тестирование, поддержку и расширение приложений.
Symfony подходит для разработки любых веб-проектов — от небольших API до крупных корпоративных систем.
Создание и запуск проекта Symfony с ServBay
ServBay обеспечивает все необходимое окружение для запуска Symfony-проекта: подходящую версию PHP, Composer, веб-сервер, базы данных и кеш-сервисы. В этом разделе пошагово показано, как создать новый проект и настроить работу с помощью возможностей ServBay.
Предварительные требования
Прежде чем начинать, убедитесь, что:
- Установлен ServBay: На вашем macOS уже установлен и запущен ServBay. Если ещё не установлен — ознакомьтесь с руководством по установке ServBay.
- ServBay работает корректно: Основные сервисы ServBay (например, Caddy или Apache, нужные базы данных) успешно запущены.
- Базовые знания: У вас есть базовое понимание PHP, Composer и основ Symfony.
Создание проекта Symfony
ServBay рекомендует хранить сайты в папке /Applications/ServBay/www
, чтобы проекты легко распознавались и управлялись из панели ServBay.
Проверьте доступность Composer
Composer уже интегрирован в ServBay и настроен — не требуется отдельная установка. В терминале выполните команду
composer --version
для проверки.Создайте папку для проекта
В каталоге сайтов создайте директорию для будущего проекта:
bashcd /Applications/ServBay/www mkdir servbay-symfony-app
1
2Создайте проект Symfony с помощью Composer
Перейдите в созданную папку и создайте шаблон сайта на основе
website-skeleton
— базовой заготовки для типового веб-приложения.bashcd /Applications/ServBay/www/servbay-symfony-app composer create-project symfony/website-skeleton .
1
2После выполнения команды Composer скачает ядро Symfony и все нужные зависимости в текущую директорию.
Первичная настройка
Основные параметры Symfony обычно настраиваются через переменные окружения, которые задаются в файле .env
— он находится в корне проекта.
Настройте переменные окружения (
.env
)Откройте файл
.env
в корне проекта. Здесь хранятся параметры окружения — например, настройки базы данных и ключи приложения. Измените или добавьте нужные значения.Проверьте корректность следующих параметров с учетом вашей среды ServBay:
dotenv# Пример файла .env APP_ENV=dev # Режим разработки APP_SECRET=your_secret_key # Замените на уникальную случайную строку для безопасности # Примеры подключения к базе данных (MySQL, PostgreSQL, подробнее ниже) # DATABASE_URL="mysql://db_user:db_password@127.0.0.1:3306/db_name?serverVersion=8.0&charset=utf8mb4" # DATABASE_URL="postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=13&charset=utf8" # DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"
1
2
3
4
5
6
7
8Замените
your_secret_key
на надёжную случайную строку. Для соединения с базой данных по умолчанию используйте пользователяroot
и парольpassword
(важно: для production-режима обязательно измените креденшиалы!). В качестве примера названия базы используемservbay_symfony_app
.
Настройка веб-сервера (сайт в ServBay)
Чтобы получить доступ к проекту из браузера, рекомендуем настроить сайт в панели ServBay — это локальный виртуальный хост. Корень веб-доступа для Symfony — папка public/
вашего проекта.
В панели ServBay перейдите в настройки “Сайт” (или “Host” в старых версиях) и добавьте новый сайт:
- Название (Name): Задайте удобное имя, например
My Symfony Dev Site
. - Домен (Domain): Укажите домен для локальной разработки, например
servbay-symfony-test.local
. ServBay автоматически настроит его для вашего окружения. - Тип сайта (Website Type): Выберите
PHP
. - Версия PHP (PHP Version): Используйте рекомендованную актуальную версию, например
8.3
. - Корневая папка (Website Root): Важный пункт! Для проекта Symfony этот путь должен вести к папке
public/
— например,/Applications/ServBay/www/servbay-symfony-app/public
.
Сохраните настройки и примените изменения. ServBay автоматически обновит конфигурацию веб-сервера. По умолчанию используются Caddy или Apache, а SSL-сертификаты для локального домена выпускаются и доверяются автоматически — можно сразу заходить по HTTPS.
Детали настройки смотрите в разделе Добавление первого сайта в ServBay.
Добавление базового примера кода
Проверить корректность настроек поможет простой пример: добавим маршрут и контроллер, который при обращении к корню сайта покажет текст.
Настройте маршрут (
config/routes.yaml
)Откройте файл
config/routes.yaml
и добавьте:yaml# config/routes.yaml index: path: / controller: App\Controller\DefaultController::index
1
2
3
4Создайте контроллер (
src/Controller/DefaultController.php
)В папке
src/Controller/
создайте файлDefaultController.php
со следующим содержимым:php<?php // src/Controller/DefaultController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; class DefaultController { /** * @Route("/", name="index") */ public function index(): Response { // Возвращает простой HTTP-ответ return new Response('Hello ServBay and Symfony!'); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18В этом примере создается контроллер с методом
index
, который с помощью аннотации@Route("/")
привязывается к корню сайта. При обращении к нему возвращается HTTP-ответ с текстом "Hello ServBay and Symfony!".
Доступ к сайту
Теперь откройте браузер и перейдите по адресу, который задали в ServBay — https://servbay-symfony-test.local
. Если всё настроено правильно, вы увидите текст:
Hello ServBay and Symfony!
1
Это значит, что ваш проект Symfony успешно запущен через веб-сервер ServBay. Рекомендуем использовать протокол https://
, так как SSL уже настроен.
Примеры работы с базой данных и кешем
Чаще всего Symfony использует Doctrine ORM для работы с реляционными базами, а кеш реализуется через Symfony Cache. ServBay предоставляет необходимые сервисы баз данных, кеша и расширения к PHP, и их легко подключить к вашему проекту.
Пример работы с реляционной базой (Doctrine ORM)
ServBay поддерживает MySQL и PostgreSQL. Ниже показано, как подключить эти базы через Symfony.
Настройте строку подключения в файле .env
Отредактируйте
.env
— раскомментируйте и укажите правильные параметрыDATABASE_URL
.- Для MySQL: Пользователь по умолчанию —
root
, пароль —password
, порт —3306
.dotenv# .env DATABASE_URL="mysql://root:password@127.0.0.1:3306/servbay_symfony_app?serverVersion=8.0&charset=utf8mb4"
1
2 - Для PostgreSQL: Пользователь по умолчанию —
root
, пароль —password
, порт —5432
.dotenv# .env DATABASE_URL="postgresql://root:password@127.0.0.1:5432/servbay_symfony_app?serverVersion=13&charset=utf8"
1
2
Убедитесь, что соответствующий сервер баз данных запущен в панели ServBay.
- Для MySQL: Пользователь по умолчанию —
Создайте базу данных
Если база
servbay_symfony_app
ещё не создана, используйте встроенные инструменты ServBay — такие как phpMyAdmin или pgAdmin — либо создайте её через команду Symfony:bashphp bin/console doctrine:database:create
1Создайте Entity и миграции
Для описания таблиц используйте Doctrine Entity, а миграции позволяют создавать структуру базы:
- Создать Entity (например,
User
):bashДобавьте нужные поля, напримерphp bin/console make:entity User
1name
(string) иemail
(string, unique). - Создать миграцию: На основе описанных Entity создайте файл миграции:bashМиграция появится в папке
php bin/console make:migration
1src/Migrations
и будет содержать SQL для создания таблиц.
- Создать Entity (например,
Выполните миграции
Чтобы применить структуру базы:
bashphp bin/console doctrine:migrations:migrate
1Примеры работы с базой из контроллера
Измените файл
src/Controller/DefaultController.php
, чтобы показать как записывать и читать данные через Doctrine. Необходимо внедритьEntityManagerInterface
.Подключите интерфейс через конструктор контроллера:
php<?php // src/Controller/DefaultController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Doctrine\ORM\EntityManagerInterface; // Импорт EntityManagerInterface use App\Entity\User; // Импорт класса User use Symfony\Component\HttpFoundation\JsonResponse; // Для возврата JSON class DefaultController { private $entityManager; // Внедрение EntityManagerInterface через конструктор public function __construct(EntityManagerInterface $entityManager) { $this->entityManager = $entityManager; } /** * @Route("/", name="app_index") */ public function index(): Response { return new Response('Hello ServBay and Symfony!'); } // ... другие методы ... }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30Затем добавьте новые маршруты в
config/routes.yaml
:yaml# config/routes.yaml # ... другие маршруты ... mysql_add_user: path: /mysql-add-user # либо /pgsql-add-user для другой базы controller: App\Controller\DefaultController::addUser mysql_get_users: path: /mysql-users # либо /pgsql-users controller: App\Controller\DefaultController::getUsers
1
2
3
4
5
6
7
8И добавьте методы контроллера:
php<?php // src/Controller/DefaultController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Doctrine\ORM\EntityManagerInterface; use App\Entity\User; use Symfony\Component\HttpFoundation\JsonResponse; // Импорт JsonResponse class DefaultController { private $entityManager; public function __construct(EntityManagerInterface $entityManager) { $this->entityManager = $entityManager; } /** * @Route("/", name="app_index") */ public function index(): Response { return new Response('Hello ServBay and Symfony!'); } /** * @Route("/add-user", name="app_add_user") */ public function addUser(): Response { $user = new User(); // Добавим пример данных, связанных с брендом ServBay $user->setName('ServBay Demo User'); $user->setEmail('demo-user@servbay.test'); // Подготовка объекта к сохранению $this->entityManager->persist($user); // Сохранение объекта в базе $this->entityManager->flush(); return new Response('User added successfully!'); } /** * @Route("/get-users", name="app_get_users") */ public function getUsers(): JsonResponse { // Получить всех пользователей из базы $users = $this->entityManager->getRepository(User::class)->findAll(); // Преобразовать результат для JSON $usersArray = []; foreach ($users as $user) { $usersArray[] = [ 'id' => $user->getId(), 'name' => $user->getName(), 'email' => $user->getEmail(), ]; } // Вернуть JSON-ответ return new JsonResponse($usersArray); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67Проверка работы
- Откройте
https://servbay-symfony-test.local/add-user
— добавляется новый пользователь. - Откройте
https://servbay-symfony-test.local/get-users
— увидите список пользователей (JSON).
- Откройте
Работа с кешем и NoSQL (Symfony Cache)
ServBay поддерживает Redis и Memcached и их расширения, позволяя использовать Symfony Cache для взаимодействия с ними.
Настройте соединение с кешем
В
.env
добавьте параметры подключения к кешу.- Memcached: порт по умолчанию —
11211
.dotenvПроверьте, что Memcached запущен в ServBay.# .env # ... другие параметры ... CACHE_DSN=memcached://127.0.0.1:11211
1
2
3 - Redis: порт по умолчанию —
6379
.dotenvЗапустите Redis через панель ServBay.# .env # ... другие параметры ... CACHE_DSN=redis://127.0.0.1:6379 # Если требуется пароль Redis (по умолчанию в ServBay без пароля): # CACHE_DSN=redis://:your_password@127.0.0.1:6379
1
2
3
4
5
- Memcached: порт по умолчанию —
Добавьте пример работы с кешем в контроллер
Измените конструктор контроллера для внедрения
CacheInterface
:php<?php // src/Controller/DefaultController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Doctrine\ORM\EntityManagerInterface; use App\Entity\User; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Contracts\Cache\CacheInterface; // Импорт CacheInterface class DefaultController { private $entityManager; private $cache; // Добавлен cache // Внедрение через конструктор public function __construct(EntityManagerInterface $entityManager, CacheInterface $cache) { $this->entityManager = $entityManager; $this->cache = $cache; // Сохранение ссылки } // ... другие методы ... }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25Затем — новый маршрут в
config/routes.yaml
:yaml# config/routes.yaml # ... другие маршруты ... cache_example: path: /cache-example controller: App\Controller\DefaultController::cacheExample
1
2
3
4
5И метод контроллера:
php<?php // src/Controller/DefaultController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Doctrine\ORM\EntityManagerInterface; use App\Entity\User; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Contracts\Cache\CacheInterface; use Symfony\Component\Cache\Item\ItemInterface; // Импорт ItemInterface class DefaultController { private $entityManager; private $cache; public function __construct(EntityManagerInterface $entityManager, CacheInterface $cache) { $this->entityManager = $entityManager; $this->cache = $cache; } // ... другие методы ... /** * @Route("/cache-example", name="app_cache_example") */ public function cacheExample(): Response { // Получить данные из кеша, или создать новые $cacheItem = $this->cache->get('my_symfony_cache_key', function (ItemInterface $item) { // При первом обращении — генерировать данные $item->expiresAfter(3600); // Кеш на час // Пример долгой операции — сложный запрос $data = "Data generated at " . date('Y-m-d H:i:s'); // Вернуть данные для кеширования return $data; }); // Полученные или сгенерированные данные $output = "From Cache: " . $cacheItem; return new Response($output); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48Проверка работы
- Перейдите на
https://servbay-symfony-test.local/cache-example
. При первом открытии данные сгенерируются и сохранятся в кеш. При последующих загрузках — будут прочитаны из кеша Memcached или Redis.
- Перейдите на
Часто задаваемые вопросы (FAQ)
Вопрос: При обращении к https://servbay-symfony-test.local
вижу ошибку 404 или 500 — что делать?
Ответ:
- Проверьте, что ServBay запущен, и что выбран веб-сервер — Caddy или Apache — активен.
- Проверьте, что сайт с доменом
servbay-symfony-test.local
добавлен, и его корневая папка указана верно:/Applications/ServBay/www/servbay-symfony-app/public
. - Откройте лог Symfony (
var/log/dev.log
) — там подробная ошибка. - Выполните в корне проекта
composer install
, чтобы поставить все зависимости. - Убедитесь, что версия PHP совместима с вашим проектом Symfony.
Вопрос: Не удается подключиться к базе данных — что делать?
Ответ:
- Проверьте, что сервер MySQL или PostgreSQL запущен через панель ServBay.
- Проверьте строку подключения
DATABASE_URL
в.env
— правильны ли логин/пароль, адрес (127.0.0.1
), порт (MySQL —3306
, PostgreSQL —5432
), имя базы. - Убедитесь, что используемые креденшиалы совпадают с теми, что заданы в ServBay.
- Проверьте, создана ли база данных
servbay_symfony_app
.
Вопрос: Команда php bin/console
не работает?
Ответ: Проверьте, что ваш текущий путь в терминале — /Applications/ServBay/www/servbay-symfony-app
, и что PHP из ServBay добавлен в PATH (обычно настраивается автоматически). Можно проверить командой which php
— путь должен вести на PHP из ServBay.
Заключение
Теперь вы успешно создали и запустили базовый проект Symfony с помощью ServBay на macOS. ServBay предоставляет полный набор необходимых компонентов (PHP, Composer, веб-сервер, базы данных, кеш), а также максимально упрощает настройку рабочего окружения — вы можете сразу переходить к разработке новых возможностей. На основе базовой заготовки рекомендовано изучать продвинутые возможности Symfony и использовать дополнительные инструменты, предоставляемые ServBay.