Crear y ejecutar un proyecto Zend Framework (Laminas) en ServBay 
Resumen 
Zend Framework (ahora parte de Laminas Project) es un poderoso framework PHP de código abierto que ofrece una amplia gama de componentes de alta calidad orientados a objetos, ideales para construir aplicaciones y servicios web modernos. Gracias a su flexibilidad, diseño modular y alto rendimiento, es una excelente opción tanto para sitios web sencillos como para aplicaciones empresariales complejas.
ServBay es un entorno de desarrollo web local diseñado para macOS y Windows. Integra PHP, varios servidores web (como Caddy y Nginx), bases de datos (como MySQL, PostgreSQL, MongoDB), servicios de caché (como Redis y Memcached), entre otras herramientas de desarrollo. ServBay facilita la configuración y administración de estos paquetes, permitiendo que el despliegue y ejecución de proyectos PHP sea sencillo y eficiente en entornos locales.
Este documento te enseñará cómo crear y ejecutar un proyecto Zend Framework (Laminas) en ServBay, integrando además los servicios de bases de datos y caché que ServBay ofrece.
Requisitos previos 
Antes de comenzar, asegúrate de cumplir con lo siguiente:
- Instalar ServBay: Debes haber instalado y ejecutado ServBay en tu sistema macOS o Windows. Si no lo has hecho, visita la web oficial de ServBay para obtener la guía de descarga e instalación.
- Paquetes ServBay: Verifica que estén instalados y en ejecución los siguientes paquetes en ServBay: - Al menos una versión de PHP (recomendado PHP 8.x o superior, ya que las versiones modernas de Zend Framework / Laminas requieren versiones actuales de PHP).
- Un servidor web (Caddy o Nginx).
- Composer (usualmente incluido en ServBay).
- Los servicios de base de datos que planees usar (por ejemplo, MySQL, PostgreSQL) y servicios de caché (Memcached, Redis). Puedes activar estos servicios fácilmente desde el panel de control de ServBay.
 
Crear un proyecto Zend Framework 
ServBay recomienda almacenar los proyectos web en las siguientes rutas, facilitando su gestión y configuración automática:
- macOS: /Applications/ServBay/www
- Windows: C:\ServBay\www
- Accede a la raíz del sitio web - Abre la terminal y navega hasta la raíz de sitios recomendada por ServBay: - macOS: bash- cd /Applications/ServBay/www1- Windows: cmd- cd C:\ServBay\www1
- Crear el proyecto con Composer - Composer ya viene preinstalado en ServBay. Utiliza el comando - create-projectpara iniciar un nuevo proyecto base de Zend Framework (Laminas skeleton application) en una subcarpeta llamada- servbay-zend-app:bash- composer create-project laminas/laminas-skeleton-application servbay-zend-app1- Este comando descargará la aplicación base de Laminas en - servbay-zend-appe instalará todas las dependencias necesarias.
- Entra al directorio del proyecto - Navega a la carpeta recién creada del proyecto: bash- cd servbay-zend-app1
Configuración del servidor web 
Para acceder al proyecto Zend Framework desde el navegador, necesitas configurar un sitio web en ServBay.
- Abre el panel de control de ServBay: Inicia la aplicación ServBay.
- Accede a la configuración de sitios: Encuentra y haz clic en la pestaña Sitios web (Websites).
- Añade un nuevo sitio: Haz clic en el botón +(abajo a la izquierda) para crear una nueva configuración de sitio.
- Rellena la información del sitio:- Nombre: Asigna un nombre sencillo, por ejemplo My Zend Dev Site.
- Dominio: Introduce el dominio que usarás en el navegador para este proyecto. Para evitar conflictos con dominios reales, se recomienda usar los sufijos .localo.test, comoservbay-zend-test.local. ServBay gestionará automáticamente la resolución DNS local.
- Tipo de sitio web: Selecciona PHP.
- Versión de PHP: Selecciona la versión de PHP que deseas usar (ejemplo 8.3). Confirma que esta versión está instalada y activa en ServBay.
- Raíz de documentos (Document Root): Es el directorio público del proyecto. El archivo index.phpde Laminas se encuentra en la carpetapublic. Por lo tanto, la raíz debe ser:/Applications/ServBay/www/servbay-zend-app/public.
 
- Nombre: Asigna un nombre sencillo, por ejemplo 
- Guardar y reiniciar: Haz clic en Guardar (Save). ServBay solicitará aplicar los cambios; confirma para que el servidor web recargue la configuración y se active el nuevo sitio.
Para más detalles consulta el capítulo Añadir el primer sitio web en la documentación de ServBay.
Ejemplo básico "Hello ServBay!" 
Vamos a modificar el código del proyecto para que, al acceder a la URL raíz (/), muestre "Hello ServBay!".
- Configura rutas y controlador (module.config.php) - Edita el archivo - module/Application/config/module.config.phpy asegúrate de que contenga la siguiente configuración básica de rutas y controlador: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', ], ], ], // ... otras configuraciones de rutas ], ], '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', ], ], // ... otras configuraciones ];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- Nota: Este fragmento representa una parte del arreglo de configuración en - module.config.php. Debes asegurarte de que la ruta- 'home'y la definición de la fábrica para- Controller\IndexController::classestén presentes y correctamente integradas en la configuración existente.
- Crea o edita el controlador (IndexController.php) - Edita (o crea) el archivo - module/Application/src/Controller/IndexController.php, asegurándote de que el método- indexActionretorne un ViewModel con el mensaje:php- <?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; class IndexController extends AbstractActionController { /** * Acción por defecto que muestra la página de bienvenida. */ public function indexAction() { // Retorna un ViewModel, pasando la variable 'message' a la vista return new ViewModel([ 'message' => 'Hello ServBay!', ]); } // ... otros métodos }1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
- Crea o edita la vista (index.phtml) - Edita (o crea) el archivo - module/Application/view/application/index/index.phtmlpara mostrar el mensaje recibido del controlador:php- <h1><?php echo $this->message; ?></h1>1- En este archivo utilizas el helper de vistas - $this->messagepara acceder a los datos enviados por el controlador.
Acceder al sitio web 
Abre el navegador y visita el dominio configurado, por ejemplo: https://servbay-zend-test.local.
Si todo está correctamente configurado, verás en la página el texto Hello ServBay!, lo que indica que tu proyecto Zend Framework ya está en ejecución en ServBay.
Ejemplos de integración de bases de datos y caché 
ServBay incluye diversos servicios de bases de datos y de caché. A continuación se muestra cómo conectar y usar Memcached, Redis, MySQL y PostgreSQL dentro de un proyecto Zend Framework.
Nota importante: Los ejemplos de base de datos y caché aquí mostrados son independientes. En proyectos reales, normalmente elegirás una base de datos y una o varias soluciones de caché, gestionando la conexión mediante inyección de dependencias. Para probar estos ejemplos, ten activo el servicio correspondiente en ServBay (por ejemplo, MySQL, PostgreSQL, Memcached, Redis).
Ejemplo interactuando con bases de datos - Crear tabla 
Primero mostramos cómo utilizar el componente Laminas DB para interactuar con la base de datos y crear una tabla sencilla. No se utiliza la herramienta oficial de migraciones, sino un script manual para crear la tabla.
- Instala el componente Laminas DB - Ejecuta en la raíz del proyecto: bash- composer require laminas/laminas-db1
- Crea la base de datos manualmente - Antes de ejecutar los ejemplos, crea una base de datos llamada - servbay_zend_appen el sistema de gestión seleccionado. Puedes utilizar herramientas gestionadas por ServBay (phpMyAdmin, pgAdmin, MongoDB Compass, etc.). El usuario por defecto para MySQL/MariaDB y PostgreSQL en ServBay es- root, y la contraseña es- password.
- Define y ejecuta el script de creación de la tabla (ejemplo) - Crea un archivo PHP (por ejemplo, - create_users_table.php) en la raíz del proyecto o en algún directorio temporal con el siguiente código:php- <?php // create_users_table.php use Laminas\Db\Adapter\Adapter; use Laminas\Db\Sql\Sql; // Supón que usas MySQL o MariaDB $adapter = new Adapter([ 'driver' => 'Pdo_Mysql', // o 'Pdo_Pgsql' 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', // Contraseña por defecto en ServBay 'hostname' => '127.0.0.1', // 'port' => 3306, // Puerto por defecto de MySQL // 'port' => 5432, // Puerto por defecto de PostgreSQL ]); $sql = new Sql($adapter); // Definir el SQL de creación de la tabla 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 "Ejecutando SQL:\n"; echo $sql->buildSqlString($create, $adapter->getPlatform()) . "\n"; try { // Ejecutar el SQL $adapter->query( $sql->buildSqlString($create, $adapter->getPlatform()), Adapter::QUERY_MODE_EXECUTE ); echo "La tabla 'users' se ha creado correctamente.\n"; } catch (\Exception $e) { echo "Error al crear la tabla: " . $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- Nota: Este script es un ejemplo manual. Para gestión avanzada de migraciones, emplea la herramienta oficial de Laminas Migrations. - Ejecuta este script en la terminal usando PHP CLI (asegúrate de estar en la raíz del proyecto o conoces la ruta): bash- php create_users_table.php1
Ejemplo de integración MySQL 
Este ejemplo muestra cómo conectar y consultar la base de datos MySQL desde un controlador en Zend Framework.
- Configura la conexión a la base de datos - Edita el archivo - config/autoload/global.phpañadiendo los datos de conexión a MySQL:php- <?php // config/autoload/global.php return [ 'db' => [ 'driver' => 'Pdo_Mysql', 'database' => 'servbay_zend_app', // Verifica que la base exista 'username' => 'root', // Usuario por defecto en ServBay 'password' => 'password', // Contraseña por defecto en ServBay 'hostname' => '127.0.0.1', 'port' => 3306, // Puerto por defecto en MySQL 'charset' => 'utf8mb4', ], // ... otras configuraciones globales ];1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
- Configura la fábrica del controlador (module.config.php) - Para inyectar la instancia de - Laminas\Db\Adapter\Adapteren el controlador, define una fábrica para- IndexController. Modifica la sección- controllersen- module/Application/config/module.config.php, reemplazando- InvokableFactorypor una función factory:php- <?php // module/Application/config/module.config.php namespace Application; use Laminas\ServiceManager\Factory\InvokableFactory; // Mantén si se usa en otros lugares use Laminas\Db\Adapter\AdapterInterface; return [ // ... otras configuraciones 'controllers' => [ 'factories' => [ Controller\IndexController::class => function($container) { $adapter = $container->get(AdapterInterface::class); return new Controller\IndexController($adapter); }, // Factory para otros controladores si lo requieres ], ], 'service_manager' => [ 'aliases' => [ AdapterInterface::class => 'Laminas\Db\Adapter\Adapter', ], 'factories' => [ 'Laminas\Db\Adapter\Adapter' => \Laminas\Db\Adapter\AdapterServiceFactory::class, ], ], // ... otras configuraciones ];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- Nota: Asegúrate que los alias y fábricas estén integrados en tu configuración original. 
- Configura las rutas (module.config.php) - Añade rutas adicionales para los endpoints de MySQL en el apartado de rutas: php- <?php // module/Application/config/module.config.php namespace Application; use Laminas\Router\Http\Literal; return [ 'router' => [ 'routes' => [ // ... rutas existentes (ej: 'home') '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', ], ], ], ], ], // ... otras configuraciones ];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
- Agrega métodos al controlador (IndexController.php) - Modifica - module/Application/src/Controller/IndexController.php, agrega el constructor para la inyección y los métodos- mysqlAddActiony- mysqlAction:php- <?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Db\Adapter\AdapterInterface; use Laminas\Db\Sql\Sql; class IndexController extends AbstractActionController { private $adapter; public function __construct(AdapterInterface $adapter) { $this->adapter = $adapter; } /** * Acción por defecto: muestra la bienvenida. */ public function indexAction() { return new ViewModel([ 'message' => 'Hello ServBay!', ]); } /** * Acción para agregar usuario a la tabla 'users' usando 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 ? 'Usuario MySQL agregado correctamente.' : 'No se pudo agregar el usuario en MySQL.'; return new ViewModel([ 'message' => $message, ]); } /** * Acción para listar usuarios de 'users' usando 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), ]); } // ... otros métodos }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
 68
 69
 70
 71
 72
 73
 74
 75
- Crea las vistas - Archivo: - module/Application/view/application/index/mysql-add.phtmlphp- <h1><?php echo $this->message; ?></h1>1- Archivo: - module/Application/view/application/index/mysql.phtmlphp- <h1>Usuarios MySQL</h1> <pre><?php echo $this->users; ?></pre>1
 2
- Probar el ejemplo MySQL - Activa el servicio MySQL en ServBay. Accede primero a - https://servbay-zend-test.local/mysql-addpara agregar un usuario. Verás el mensaje de éxito "Usuario MySQL agregado correctamente". Luego ve a- https://servbay-zend-test.local/mysqlpara listar los usuarios en formato JSON.
Ejemplo de integración PostgreSQL 
Este ejemplo muestra cómo conectar y consultar la base de datos PostgreSQL desde el controlador.
- Configura la conexión a PostgreSQL - Edita - config/autoload/global.phpcambiando la configuración a PostgreSQL:php- <?php // config/autoload/global.php return [ 'db' => [ 'driver' => 'Pdo_Pgsql', 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', 'hostname' => '127.0.0.1', 'port' => 5432, ], // ... otras configuraciones ];1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13- Nota: Si quieres probar MySQL y PostgreSQL al mismo tiempo, necesitas una configuración más avanzada o un entorno separado. 
- Configura la fábrica del controlador (module.config.php) - Si ya configuraste la fábrica en el ejemplo MySQL, puedes omitir este paso. 
- Configura las rutas (module.config.php) - Añade dos rutas nuevas: php- <?php // module/Application/config/module.config.php namespace Application; use Laminas\Router\Http\Literal; return [ 'router' => [ 'routes' => [ // ... rutas existentes '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', ], ], ], ], ], // ... otras configuraciones ];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
- Agrega métodos al controlador (IndexController.php) - Añade estos métodos al controlador: php- <?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Db\Adapter\AdapterInterface; use Laminas\Db\Sql\Sql; class IndexController extends AbstractActionController { private $adapter; public function __construct(AdapterInterface $adapter) { $this->adapter = $adapter; } // ... otros métodos existentes /** * Acción para agregar usuario usando PostgreSQL. */ public 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 ? 'Usuario PostgreSQL agregado correctamente.' : 'No se pudo agregar el usuario en PostgreSQL.'; return new ViewModel([ 'message' => $message, ]); } /** * Acción para listar usuarios usando PostgreSQL. */ 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
 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
- Crea las vistas - Archivo: - module/Application/view/application/index/pgsql-add.phtmlphp- <h1><?php echo $this->message; ?></h1>1- Archivo: - module/Application/view/application/index/pgsql.phtmlphp- <h1>Usuarios PostgreSQL</h1> <pre><?php echo $this->users; ?></pre>1
 2
- Probar el ejemplo PostgreSQL - Activa el servicio PostgreSQL en ServBay. Accede primero a - https://servbay-zend-test.local/pgsql-addpara agregar un usuario y luego a- https://servbay-zend-test.local/pgsqlpara ver los datos.
Ejemplo de integración Memcached 
Este ejemplo muestra cómo usar Memcached para el almacenamiento en caché en el controlador.
- Instala el adaptador Memcached - En el archivo - composer.jsonde tu proyecto añade:json- // composer.json { "require": { "laminas/laminas-skeleton-application": "^1.0", "laminas/laminas-cache-storage-adapter-memcached": "^2.0" // ... otras dependencias }, // ... otras configuraciones }1
 2
 3
 4
 5
 6
 7
 8
 9- Ejecuta: bash- composer update1- ServBay ya incluye la extensión PHP - memcached.
- Configura la ruta (module.config.php) - Añade la ruta para el endpoint Memcached: php- <?php // module/Application/config/module.config.php namespace Application; use Laminas\Router\Http\Literal; return [ 'router' => [ 'routes' => [ // ... rutas existentes 'memcached' => [ 'type' => Literal::class, 'options' => [ 'route' => '/memcached', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'memcached', ], ], ], ], ], // ... otras configuraciones ];1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
- Agrega el método al controlador (IndexController.php) - Añade el método para Memcached: php- <?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Cache\StorageFactory; use Laminas\Cache\Storage\StorageInterface; class IndexController extends AbstractActionController { // ... constructor y otros métodos /** * Acción para demostrar uso de Memcached. */ public function memcachedAction() { // Crea la instancia de almacenamiento de caché Memcached // El servicio de Memcached en ServBay se ejecuta en 127.0.0.1:11211 $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! (Datos desde fuente, cacheados en ' . 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
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
- Crea la vista - Archivo: - module/Application/view/application/index/memcached.phtmlphp- <h1>Ejemplo Memcached</h1> <p><?php echo $this->message; ?></p>1
 2
- Probar el ejemplo Memcached - Activa el servicio Memcached en ServBay. Accede a - https://servbay-zend-test.local/memcached: la primera vez verás "CACHE MISS". En visitas posteriores dentro de los 300 segundos (TTL del ejemplo), el mensaje será "CACHE HIT".
Ejemplo de integración Redis 
Este ejemplo muestra cómo usar Redis para almacenamiento en caché o persistencia de datos desde el controlador.
- Instala el adaptador Redis - En el archivo - composer.jsonde tu proyecto añade:json- // composer.json { "require": { "laminas/laminas-skeleton-application": "^1.0", "laminas/laminas-cache-storage-adapter-redis": "^2.0", "ext-redis": "*" // ... otras dependencias }, // ... otras configuraciones }1
 2
 3
 4
 5
 6
 7
 8
 9
 10- Ejecuta: bash- composer update1- ServBay incluye la extensión PHP - redispor defecto.
- Configura la ruta (module.config.php) - Añade la ruta para el endpoint Redis: php- <?php // module/Application/config/module.config.php namespace Application; use Laminas\Router\Http\Literal; return [ 'router' => [ 'routes' => [ // ... rutas existentes 'redis' => [ 'type' => Literal::class, 'options' => [ 'route' => '/redis', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'redis', ], ], ], ], ], // ... otras configuraciones ];1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
- Agrega el método al controlador (IndexController.php) - Método para Redis: php- <?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Cache\StorageFactory; use Laminas\Cache\Storage\StorageInterface; class IndexController extends AbstractActionController { // ... constructor y otros métodos /** * Acción para demostrar uso de Redis. */ public function redisAction() { // Crea la instancia de almacenamiento de caché Redis // El servicio Redis de ServBay opera en 127.0.0.1:6379 $cache = StorageFactory::factory([ 'adapter' => [ 'name' => 'redis', 'options' => [ 'server' => [ 'host' => '127.0.0.1', 'port' => 6379, // 'database' => 0, ], 'ttl' => 300, ], ], 'plugins' => [ 'serializer', 'exception_handler' => ['throw_exceptions' => false], ], ]); $cacheKey = 'my_redis_data'; $cachedData = $cache->getItem($cacheKey, $success); if (!$success) { $cachedData = 'Hello Redis! (Datos desde fuente, cacheados en ' . 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
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
- Crea la vista - Archivo: - module/Application/view/application/index/redis.phtmlphp- <h1>Ejemplo Redis</h1> <p><?php echo $this->message; ?></p>1
 2
- Probar el ejemplo Redis - Activa el servicio Redis en ServBay. Accede a - https://servbay-zend-test.local/redis: la primera vez verás "CACHE MISS". En visitas posteriores durante 300 segundos, verás "CACHE HIT", indicando que el dato es leído desde la caché.
Conclusión 
Siguiendo estos pasos habrás instalado, configurado y ejecutado correctamente un proyecto Zend Framework (Laminas) en el entorno de desarrollo local ServBay. Aprendiste cómo configurar el servidor web para apuntar al directorio público del proyecto y cómo integrar servicios como MySQL, PostgreSQL, Memcached y Redis.
ServBay simplifica la construcción y administración del entorno local para que puedas enfocarte en desarrollar código y proyectos. Gracias a sus múltiples paquetes y configuraciones flexibles, puedes simular entornos de producción localmente y mejorar tu eficiencia de desarrollo.
