Создание и запуск проекта Zend Framework (Laminas) в ServBay
Общая информация
Zend Framework (ныне часть Laminas Project) — это мощный open-source PHP-фреймворк, обеспечивающий высококачественные объектно-ориентированные компоненты для построения современных веб-приложений и сервисов. Он известен своей гибкостью, модульной архитектурой и высокой производительностью, что делает его идеальным как для простых сайтов, так и для сложных корпоративных решений.
ServBay — это удобная локальная среда для веб-разработки на macOS и Windows, объединяющая PHP, различные веб-серверы (например, Caddy и Nginx), базы данных (MySQL, PostgreSQL, MongoDB), системы кэширования (Redis, Memcached) и другие вспомогательные инструменты. ServBay позволяет легко настраивать и управлять всеми пакетами, что значительно упрощает развертывание и запуск PHP-проектов локально.
В этом руководстве вы узнаете, как создать и запустить проект Zend Framework (Laminas) в ServBay и интегрировать базы данных и сервисы кэширования, предлагаемые платформой.
Минимальные требования
Перед началом убедитесь, что выполнены следующие шаги:
- Установлен ServBay: Программа установлена и запущена на вашем компьютере (macOS или Windows). Если ServBay ещё не установлен, перейдите на официальный сайт ServBay и следуйте инструкциям по загрузке и установке.
- Необходимые пакеты ServBay: В ServBay активированы следующие компоненты:
- Минимум одна версия PHP (рекомендуется PHP 8.x или новее — современные релизы Zend Framework / Laminas требуют актуальной версии).
- Веб-сервер (Caddy или Nginx).
- Composer (обычно предустановлен в ServBay).
- Используемая вами СУБД (например, MySQL или PostgreSQL) и службы кэширования (Memcached, Redis). Запустить или остановить сервисы можно с помощью панели управления ServBay.
Создание проекта Zend Framework
ServBay рекомендует хранить все сайты и проекты по следующим адресам для эффективного управления:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
Переход в корневой каталог сайта
Откройте терминал и перейдите в директорию, обозначенную ServBay как корневую:
macOS:
bashcd /Applications/ServBay/www
1Windows:
cmdcd C:\ServBay\www
1Создание проекта через Composer
Composer уже установлен в поставке ServBay, отдельная установка не требуется. Запустите команду
create-project
для создания каркасного проекта Zend Framework (Laminas) в папкеservbay-zend-app
:bashcomposer create-project laminas/laminas-skeleton-application servbay-zend-app
1Эта команда скачает skeleton-приложение Zend Framework (Laminas) в каталог
servbay-zend-app
с необходимыми зависимостями.Переход в директорию проекта
Перейдите в созданную папку проекта:
bashcd servbay-zend-app
1
Настройка веб-сервера
Чтобы открыть ваш проект Zend Framework в браузере, требуется создать сайт в ServBay.
- Откройте панель управления ServBay — запустите приложение ServBay.
- Перейдите в раздел сайтов: В панели найдите и откройте вкладку Веб-сайты (Websites).
- Добавьте новый сайт: Нажмите кнопку
+
, чтобы добавить новую конфигурацию. - Заполните детали сайта:
- Название (Name): Задайте понятное имя, например,
My Zend Dev Site
. - Домен (Domain): Впишите удобный для открытия в браузере домен. Чтобы избежать конфликта с реальными доменами, используйте суффикс
.local
или.test
, например,servbay-zend-test.local
. ServBay автоматически настоит локальное разрешение DNS. - Тип сайта (Website Type): Выберите
PHP
. - Версия PHP (PHP Version): Укажите используемую версию PHP (например,
8.3
). Убедитесь, что эта версия установлена и активна в ServBay. - Корень сайта (Document Root): Это папка, которую веб-сервер предоставляет для публичного доступа. Главный файл Zend Framework (
index.php
) расположен в каталогеpublic
вашего проекта:/Applications/ServBay/www/servbay-zend-app/public
.
- Название (Name): Задайте понятное имя, например,
- Сохранить и перезапустить: Нажмите кнопку Сохранить (Save). После подтверждения ServBay применит изменения, перезапустит сервер и активирует ваш сайт.
Подробную инструкцию по добавлению сайта смотрите в разделе Добавление первого сайта документации ServBay.
Пример "Hello ServBay!"
Давайте изменим код проекта, чтобы при открытии корневого URL (/
) выводилось "Hello ServBay!".
Настройка маршрутов и контроллера (module.config.php)
Отредактируйте файл
module/Application/config/module.config.php
в корне проекта. Проверьте, что он содержит необходимые настройки маршрутов и контроллеров:php<?php declare(strict_types=1); namespace Application; use Laminas\Router\Http\Literal; use Laminas\Router\Http\Segment; use Laminas\ServiceManager\Factory\InvokableFactory; return [ 'router' => [ 'routes' => [ 'home' => [ 'type' => Literal::class, 'options' => [ 'route' => '/', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'index', ], ], ], // ... дополнительные маршруты ], ], 'controllers' => [ 'factories' => [ Controller\IndexController::class => InvokableFactory::class, ], ], 'view_manager' => [ 'display_not_found_reason' => true, 'display_exceptions' => true, 'doctype' => 'HTML5', 'not_found_template' => 'error/404', 'exception_template' => 'error/index', 'template_map' => [ 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', 'error/404' => __DIR__ . '/../view/error/404.phtml', 'error/index' => __DIR__ . '/../view/error/index.phtml', ], 'template_path_stack' => [ __DIR__ . '/../view', ], ], // ... дополнительные настройки ];
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Примечание: Это часть конфигурации; объедините её с вашим текущим массивом настроек и убедитесь, что маршрут
'home'
и фабрика дляController\IndexController::class
заданы.Создание или изменение контроллера (IndexController.php)
Создайте или измените файл
module/Application/src/Controller/IndexController.php
, чтобы методindexAction
возвращал ViewModel с сообщением:php<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; class IndexController extends AbstractActionController { /** * Метод по умолчанию для отображения приветственной страницы. */ public function indexAction() { // Возвращаем ViewModel с переменной 'message' для шаблона return new ViewModel([ 'message' => 'Hello ServBay!', ]); } // ... дополнительные методы действий }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24Создание или изменение шаблона представления (index.phtml)
Создайте или измените файл
module/Application/view/application/index/index.phtml
. В шаблон будет передано значениеmessage
:php<h1><?php echo $this->message; ?></h1>
1Здесь используется view helper
$this->message
для вывода данных из контроллера.
Открытие сайта
Откройте браузер и перейдите по адресу, настроенному в ServBay, например: https://servbay-zend-test.local
.
Если всё настроено правильно, вы увидите страницу с надписью Hello ServBay!
, что означает, что проект Zend Framework успешно запущен в ServBay.
Примеры интеграции баз данных и кеша
ServBay поддерживает подключение различных СУБД и сервисов кеширования. Ниже приведены примеры работы с Memcached, Redis, MySQL и PostgreSQL.
Важно: Все примеры независимы, для реальных проектов используйте подходящие базы и кеш-сервисы с внедрением зависимостей и централизованным управлением подключениями. Перед запуском убедитесь, что соответствующие сервисы в ServBay запущены (MySQL, PostgreSQL, Memcached, Redis).
Пример работы с базой — создание таблицы
Покажем, как с помощью компонента Laminas DB создать простую таблицу.
Установка Laminas DB
Перейдите в корень проекта и установите компонент через Composer:
bashcomposer require laminas/laminas-db
1Ручное создание базы данных
Перед запуском примера создайте базу данных
servbay_zend_app
через инструменты управления ServBay (phpMyAdmin, pgAdmin, MongoDB Compass и др.). В ServBay для MySQL/MariaDB логин по умолчанию —root
, пароль —password
. Для PostgreSQL — такжеroot
иpassword
.Создание скрипта для таблицы (пример)
Создайте PHP-файл (например,
create_users_table.php
) с кодом для создания таблицыusers
:php<?php // create_users_table.php use Laminas\Db\Adapter\Adapter; use Laminas\Db\Sql\Sql; // Предполагается использование MySQL или MariaDB $adapter = new Adapter([ 'driver' => 'Pdo_Mysql', // или 'Pdo_Pgsql' 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', // пароль по умолчанию ServBay 'hostname' => '127.0.0.1', // 'port' => 3306, // стандартный порт MySQL // 'port' => 5432, // стандартный порт PostgreSQL ]); $sql = new Sql($adapter); // Описание SQL для создания таблицы users $create = $sql->createTable('users') ->addColumn(new \Laminas\Db\Sql\Ddl\Column\Integer('id', false, null, ['AUTO_INCREMENT' => true])) ->addColumn(new \Laminas\Db\Sql\Ddl\Column\Varchar('name', 255)) ->addColumn(new \Laminas\Db\Sql\Ddl\Column\Varchar('email', 255, ['UNIQUE' => true])) ->addConstraint(new \Laminas\Db\Sql\Ddl\Constraint\PrimaryKey('id')); echo "Executing SQL:\n"; echo $sql->buildSqlString($create, $adapter->getPlatform()) . "\n"; try { // Выполнение SQL $adapter->query( $sql->buildSqlString($create, $adapter->getPlatform()), Adapter::QUERY_MODE_EXECUTE ); echo "Table 'users' created successfully.\n"; } catch (\Exception $e) { echo "Error creating table: " . $e->getMessage() . "\n"; }
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Примечание: Пример рассчитан на ручное выполнение. В реальных проектах используйте инструмент миграций Laminas.
Запустите скрипт через терминал (находясь в нужной директории):
bashphp create_users_table.php
1
Пример интеграции с MySQL
Пример подключения и запросов к MySQL из контроллера Zend Framework.
Настройка подключения
Отредактируйте
config/autoload/global.php
для MySQL:php<?php // config/autoload/global.php return [ 'db' => [ 'driver' => 'Pdo_Mysql', 'database' => 'servbay_zend_app', // предварительно созданная база 'username' => 'root', // стандартный логин ServBay 'password' => 'password', // стандартный пароль 'hostname' => '127.0.0.1', 'port' => 3306, 'charset' => 'utf8mb4', ], // ... остальные настройки ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14Фабрика контроллера (module.config.php)
Для внедрения адаптера базы добавьте фабрику для
IndexController
:php<?php // module/Application/config/module.config.php namespace Application; use Laminas\ServiceManager\Factory\InvokableFactory; use Laminas\Db\Adapter\AdapterInterface; return [ // ... 'controllers' => [ 'factories' => [ Controller\IndexController::class => function($container) { // Получаем адаптер базы данных $adapter = $container->get(AdapterInterface::class); // Возвращаем контроллер с внедрённым адаптером return new Controller\IndexController($adapter); }, ], ], 'service_manager' => [ 'aliases' => [ AdapterInterface::class => 'Laminas\Db\Adapter\Adapter', ], 'factories' => [ 'Laminas\Db\Adapter\Adapter' => \Laminas\Db\Adapter\AdapterServiceFactory::class, ], ], // ... ];
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Примечание: Объедините этот фрагмент с актуальной конфигурацией. Важно корректно настроить
service_manager
.Добавление маршрутов MySQL
В разделе маршрутизации добавьте пути для примеров работы с MySQL:
php'mysql-add' => [ 'type' => Literal::class, 'options' => [ 'route' => '/mysql-add', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'mysqlAdd', ], ], ], 'mysql' => [ 'type' => Literal::class, 'options' => [ 'route' => '/mysql', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'mysql', ], ], ],
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20Методы контроллера для MySQL
Добавьте методы в
IndexController
:php/** * Добавление пользователя в таблицу 'users' через MySQL. */ public function mysqlAddAction() { $sql = new Sql($this->adapter); $insert = $sql->insert('users') ->values([ 'name' => 'ServBay Demo User', 'email' => 'demo-mysql@servbay.test', ]); $statement = $sql->prepareStatementForSqlObject($insert); $result = $statement->execute(); $message = $result->getAffectedRows() > 0 ? 'MySQL User added successfully.' : 'Failed to add MySQL user.'; return new ViewModel([ 'message' => $message, ]); } /** * Получение всех пользователей из таблицы 'users' через MySQL. */ public function mysqlAction() { $sql = new Sql($this->adapter); $select = $sql->select('users'); $statement = $sql->prepareStatementForSqlObject($select); $result = $statement->execute(); $users = []; foreach ($result as $row) { $users[] = $row; } return new ViewModel([ 'users' => json_encode($users, JSON_PRETTY_PRINT), ]); }
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Добавьте конструктор для внедрения адаптера и эти методы в класс.
Шаблоны представлений
Создайте файлы:
mysql-add.phtml
php<h1><?php echo $this->message; ?></h1>
1mysql.phtml
php<h1>MySQL Users</h1> <pre><?php echo $this->users; ?></pre>
1
2
Запуск примера
Убедитесь, что MySQL запущен. Перейдите:
https://servbay-zend-test.local/mysql-add
для добавления пользователя.https://servbay-zend-test.local/mysql
для просмотра данных таблицы в JSON.
Пример интеграции с PostgreSQL
Аналогичные шаги — подключение, запросы, и маршруты для PostgreSQL.
Настройка подключения
В
config/autoload/global.php
смените настройки:php'db' => [ 'driver' => 'Pdo_Pgsql', 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', 'hostname' => '127.0.0.1', 'port' => 5432, ],
1
2
3
4
5
6
7
8Фабрика контроллера
Если для MySQL всё настроено, менять ничего не надо.
Маршруты PostgreSQL
В разделе маршрутов:
php'pgsql-add' => [ 'type' => Literal::class, 'options' => [ 'route' => '/pgsql-add', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'pgsqlAdd', ], ], ], 'pgsql' => [ 'type' => Literal::class, 'options' => [ 'route' => '/pgsql', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'pgsql', ], ], ],
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20Методы контроллера для PostgreSQL
phppublic function pgsqlAddAction() { $sql = new Sql($this->adapter); $insert = $sql->insert('users') ->values([ 'name' => 'ServBay Demo User', 'email' => 'demo-pgsql@servbay.test', ]); $statement = $sql->prepareStatementForSqlObject($insert); $result = $statement->execute(); $message = $result->getAffectedRows() > 0 ? 'PostgreSQL User added successfully.' : 'Failed to add PostgreSQL user.'; return new ViewModel([ 'message' => $message, ]); } public function pgsqlAction() { $sql = new Sql($this->adapter); $select = $sql->select('users'); $statement = $sql->prepareStatementForSqlObject($select); $result = $statement->execute(); $users = []; foreach ($result as $row) { $users[] = $row; } return new ViewModel([ 'users' => json_encode($users, JSON_PRETTY_PRINT), ]); }
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Шаблоны представлений
pgsql-add.phtml
php<h1><?php echo $this->message; ?></h1>
1pgsql.phtml
php<h1>PostgreSQL Users</h1> <pre><?php echo $this->users; ?></pre>
1
2
Проверка PostgreSQL
Запустите сервис PostgreSQL и перейдите по:
https://servbay-zend-test.local/pgsql-add
https://servbay-zend-test.local/pgsql
Пример использования Memcached
Показан способ кэширования данных через Memcached.
Установка адаптера Memcached
В зависимости проекта (
composer.json
):json{ "require": { "laminas/laminas-skeleton-application": "^1.0", "laminas/laminas-cache-storage-adapter-memcached": "^2.0" } }
1
2
3
4
5
6Затем:
bashcomposer update
1Расширение
memcached
в PHP уже есть в ServBay.Маршрут для Memcached
php'memcached' => [ 'type' => Literal::class, 'options' => [ 'route' => '/memcached', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'memcached', ], ], ],
1
2
3
4
5
6
7
8
9
10Метод контроллера для Memcached
phppublic function memcachedAction() { $cache = StorageFactory::factory([ 'adapter' => [ 'name' => 'memcached', 'options' => [ 'servers' => [ ['127.0.0.1', 11211], ], 'ttl' => 300, ], ], 'plugins' => [ 'serializer', 'exception_handler' => ['throw_exceptions' => false], ], ]); $cacheKey = 'my_memcached_data'; $cachedData = $cache->getItem($cacheKey, $success); if (!$success) { $cachedData = 'Hello Memcached! (Данные получены из источника, закэшированы в ' . date('Y-m-d H:i:s') . ')'; $cache->setItem($cacheKey, $cachedData); $cachedData .= ' - CACHE MISS'; } else { $cachedData .= ' - CACHE HIT'; } return new ViewModel([ 'message' => $cachedData, ]); }
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Шаблон представления
memcached.phtml
php<h1>Пример Memcached</h1> <p><?php echo $this->message; ?></p>
1
2
Проверка примера
Запустите Memcached, зайдите по адресу:
https://servbay-zend-test.local/memcached
. При первом обращении будет "CACHE MISS", при повторных — "CACHE HIT" до истечения 300 секунд.
Пример использования Redis
Способ кэширования и хранения данных через Redis.
Установка адаптера Redis
В зависимости проекта (
composer.json
):json{ "require": { "laminas/laminas-skeleton-application": "^1.0", "laminas/laminas-cache-storage-adapter-redis": "^2.0", "ext-redis": "*" } }
1
2
3
4
5
6
7Затем:
bashcomposer update
1Расширение
redis
для PHP уже установлено в ServBay.Маршрут для Redis
php'redis' => [ 'type' => Literal::class, 'options' => [ 'route' => '/redis', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'redis', ], ], ],
1
2
3
4
5
6
7
8
9
10Метод контроллера для Redis
phppublic function redisAction() { $cache = StorageFactory::factory([ 'adapter' => [ 'name' => 'redis', 'options' => [ 'server' => [ 'host' => '127.0.0.1', 'port' => 6379, ], 'ttl' => 300, ], ], 'plugins' => [ 'serializer', 'exception_handler' => ['throw_exceptions' => false], ], ]); $cacheKey = 'my_redis_data'; $cachedData = $cache->getItem($cacheKey, $success); if (!$success) { $cachedData = 'Hello Redis! (Данные получены из источника, закэшированы в ' . date('Y-m-d H:i:s') . ')'; $cache->setItem($cacheKey, $cachedData); $cachedData .= ' - CACHE MISS'; } else { $cachedData .= ' - CACHE HIT'; } return new ViewModel([ 'message' => $cachedData, ]); }
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Шаблон представления
redis.phtml
php<h1>Пример Redis</h1> <p><?php echo $this->message; ?></p>
1
2
Проверка примера
Запустите Redis и перейдите на страницу:
https://servbay-zend-test.local/redis
. Аналогично Memcached, первый раз — "CACHE MISS", дальше — "CACHE HIT" до истечения ttl.
Итог
Следуя рекомендациям выше, вы сможете создать, настроить и запустить проект Zend Framework (Laminas) в локальной среде ServBay. Кроме развертывания сайта, вы научились интегрировать MySQL, PostgreSQL и кэш-сервисы Memcached и Redis.
ServBay значительно упрощает настройку и сопровождение рабочей среды, позволяя сосредоточиться на написании кода и развитии проекта. Благодаря широкому набору пакетов и гибкой конфигурации можно легко эмулировать production-окружение локально и повышать продуктивность разработки.