Создание и запуск проекта Symfony
ServBay — это локальная среда веб-разработки, специально созданная для macOS. Она интегрирует среды исполнения для PHP, Node.js, Python, Go, Java и других языков, а также базы данных MySQL, PostgreSQL, MongoDB, Redis и т.д. Есть поддержка веб-серверов Apache и Caddy. В этом руководстве подробно показано, как использовать ServBay для быстрой настройки и запуска проекта Symfony на macOS.
Что такое Symfony?
Symfony — это открытый фреймворк для разработки веб-приложений на PHP, созданный SensioLabs. Он предоставляет разработчикам эффективный, гибкий и мощный набор инструментов для создания современных веб-приложений и API. Symfony следует лучшим веб-практикам и предлагает множество функциональных компонентов, таких как маршрутизация, шаблонизатор Twig, работа с формами, аутентификация, внедрение зависимостей и многое другое, делая повседневные задачи веб-разработки проще и быстрее.
Ключевые особенности и преимущества Symfony
- Модульная архитектура: Сердце Symfony — библиотека многоразовых компонентов. Разработчики могут выбирать только те модули, которые нужны, строя как легковесные, так и масштабные приложения.
- Высокая производительность: Благодаря продуманной архитектуре, эффективным механизмам кеширования и поддержке новейших возможностей PHP, Symfony отличается отличной производительностью.
- Мощное сообщество: У Symfony большое и активное сообщество, множество сторонних бандлов (плагинов) и богатая документация, что позволяет находить решения практически любой проблемы.
- Гибкость: Легко интегрируется с внешними библиотеками и расширениями, подходит для любых типов и размеров проектов.
- Стабильность и поддерживаемость: Следование лучшим стандартам кодирования и архитектурным паттернам обеспечивает удобство тестирования, поддержки и расширения созданных приложений.
Symfony подходит для проектов любого масштаба — от небольших API до корпоративных систем.
Создание и запуск проекта Symfony с помощью ServBay
ServBay предоставляет полный набор инструментов для запуска проектов Symfony, включая нужную версию PHP, Composer, веб-сервер, базы данных и кеширующие сервисы. В этом разделе вы узнаете, как с нуля создать и сконфигурировать новый проект Symfony с помощью ServBay.
Необходимые условия
Перед началом убедитесь, что вы выполнили следующие шаги:
- Установлен ServBay: ServBay успешно установлен и запущен на вашем macOS. Если этого ещё не сделали, следуйте руководству по установке ServBay.
- ServBay работает корректно: Основные сервисы ServBay (например, Caddy или Apache, а также нужные базы данных) запущены.
- Базовые знания: Минимально разбираетесь в PHP, Composer и основах Symfony.
Создание проекта Symfony
Рекомендуется размещать все проекты сайтов в директории /Applications/ServBay/www
, чтобы ServBay мог удобно их распознавать и управлять ими.
Проверьте Composer
Composer уже встроен в ServBay и настроен в переменных окружения — отдельно устанавливать его не нужно. Проверьте его доступность командой
composer --version
в терминале.Создайте директорию проекта
Создайте новую папку в рекомендованной корневой директории web-проектов:
bashcd /Applications/ServBay/www mkdir servbay-symfony-app
1
2Создайте проект Symfony с помощью Composer
Перейдите в созданную папку и используйте Composer для генерации базового скелета проекта на основе
website-skeleton
— комплекта для традиционных веб-приложений Symfony.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 — подробнее ниже) # 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
на безопасную уникальную строку. По умолчанию для баз данных в ServBay логин —root
, пароль —password
(никогда не используйте эти значения на проде!). В качестве примера базы используемservbay_symfony_app
.
Настройка веб-сайта (Сайт в ServBay)
Чтобы открыть ваш Symfony проект в браузере, используйте раздел "Сайты" в ServBay для настройки локального виртуального хоста. Веб-корень для Symfony — это папка public/
в проекте.
Откройте панель управления ServBay, перейдите к настройкам сайтов ("Главная" или "Сайты", в старых версиях — "Хосты") и добавьте новый сайт:
- Имя (Name): Понятное название, например
My Symfony Dev Site
. - Домен (Domain): Локальный домен, например
servbay-symfony-test.local
. ServBay сам его сопоставит с localhost. - Тип сайта (Website Type): Выберите
PHP
. - Версия PHP (PHP Version): Совместимую с Symfony версию; рекомендуем последнюю стабильную, например,
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
и добавьте следующее, чтобы описать маршрут корня/
на методindex
контроллера: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Здесь определяется контроллер
DefaultController
, а методindex
связывается аннотацией@Route("/")
с корневым адресом/
. При заходе на сайт будет возвращён текст "Hello ServBay and Symfony!".
Доступ к сайту
Откройте браузер и перейдите по адресу вашего локального домена, например: https://servbay-symfony-test.local
. Если всё настроено верно, вы увидите:
Hello ServBay and Symfony!
1
Это значит, что Symfony успешно работает в ServBay через веб-сервер. Рекомендуется всегда использовать HTTPS: ServBay всё настроит автоматически.
Примеры работы с БД и кешем
Symfony обычно использует Doctrine ORM для работы с реляционными базами, и компонент Symfony Cache для кеширования и NoSQL. ServBay поддерживает базы данных и расширения PHP для них, так что использовать их в проекте — легко.
Работа с реляционными базами (Doctrine ORM)
ServBay поддерживает MySQL и PostgreSQL. Рассмотрим, как их использовать с Symfony.
Настройте подключение к базе
В
.env
в корне проекта раскомментируйте и отредактируйте строкуDATABASE_URL
для вашей базы.- Для MySQL: В ServBay по умолчанию логин 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
Убедитесь, что нужная служба базы (MySQL или PostgreSQL) запущена в панели ServBay.
- Для MySQL: В ServBay по умолчанию логин MySQL —
Создайте базу данных
Если базы
servbay_symfony_app
ещё нет, создайте её через phpMyAdmin или pgAdmin (они доступны через интерфейс ServBay), либо командой Symfony:bashphp bin/console doctrine:database:create
1Создайте Entity и миграции
Doctrine в Symfony работает через Entity — классы для таблиц БД. Генерировать Entity и миграции удобно через Maker Bundle.
- Создаём Entity (например, модель
User
):bashСледуйте подсказкам: можно добавить поляphp bin/console make:entity User
1name
(string),email
(string, unique=yes). - Создаём миграции: По изменённым Entity создаём миграции:bashМиграция окажется в
php bin/console make:migration
1src/Migrations
.
- Создаём 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 если используете PostgreSQL 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; 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(); // Формируем массив для JsonResponse $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, а также PHP-расширения для них. Использовать Symfony Cache с этими сервисами очень просто.
Настройте подключение к кешу
В
.env
укажите параметры используемой кеш-системы.- Для Memcached: В ServBay порт Memcached —
11211
.dotenvОсталось лишь убедиться, что Memcached запущен в панели ServBay.# .env # ... другие параметры ... CACHE_DSN=memcached://127.0.0.1:11211
1
2
3 - Для Redis: Redis по умолчанию — порт
6379
.dotenvПроверьте, что Redis включён в ServBay.# .env # ... другие параметры ... CACHE_DSN=redis://127.0.0.1:6379 # Если нужен пароль (по умолчанию нет), используйте: # CACHE_DSN=redis://:your_password@127.0.0.1:6379
1
2
3
4
5
- Для Memcached: В ServBay порт 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; // Через конструктор внедряем кеш 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); // Кеш на 1 час // Симулируем долгую операцию, например сложный запрос к базе $data = "Data generated at " . date('Y-m-d H:i:s'); // Вернём значение для сохранения в кеше return $data; }); // $cacheItem — данные из кеша или новые $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
сайт не найден или ошибка 500 — что делать?
Ответ: Проверьте следующее:
- Убедитесь, что ServBay работает и выбранный сайт (Caddy/Apache) запущен.
- Проверьте настройки сайта в ServBay: правильный ли домен (
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 вашей системы (обычно это делается автоматически при установке ServBay). Проверьте, что используется нужный PHP: which php
.
Заключение
С помощью этого руководства вы смогли создать, настроить и запустить базовый проект Symfony на macOS с помощью ServBay. В вашем распоряжении все необходимые компоненты (PHP, Composer, веб-сервер, база данных, кеш), а конфигурация сведена к минимуму. Это позволяет быстро приступить к разработке и исследовать новые возможности Symfony — используя богатый набор сервисов и пакетов, доступных в ServBay.