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:
bashcd /Applications/ServBay/www
1Windows:
cmdcd C:\ServBay\www
1Crear el proyecto con Composer
Composer ya viene preinstalado en ServBay. Utiliza el comando
create-project
para iniciar un nuevo proyecto base de Zend Framework (Laminas skeleton application) en una subcarpeta llamadaservbay-zend-app
:bashcomposer create-project laminas/laminas-skeleton-application servbay-zend-app
1Este comando descargará la aplicación base de Laminas en
servbay-zend-app
e instalará todas las dependencias necesarias.Entra al directorio del proyecto
Navega a la carpeta recién creada del proyecto:
bashcd servbay-zend-app
1
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
.local
o.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.php
de 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.php
y 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
49Nota: 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 paraController\IndexController::class
esté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étodoindexAction
retorne 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
24Crea o edita la vista (index.phtml)
Edita (o crea) el archivo
module/Application/view/application/index/index.phtml
para mostrar el mensaje recibido del controlador:php<h1><?php echo $this->message; ?></h1>
1En este archivo utilizas el helper de vistas
$this->message
para 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:
bashcomposer require laminas/laminas-db
1Crea la base de datos manualmente
Antes de ejecutar los ejemplos, crea una base de datos llamada
servbay_zend_app
en 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 esroot
, y la contraseña espassword
.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
38Nota: 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):
bashphp create_users_table.php
1
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.php
añ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
14Configura la fábrica del controlador (module.config.php)
Para inyectar la instancia de
Laminas\Db\Adapter\Adapter
en el controlador, define una fábrica paraIndexController
. Modifica la seccióncontrollers
enmodule/Application/config/module.config.php
, reemplazandoInvokableFactory
por 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
28Nota: 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
34Agrega métodos al controlador (IndexController.php)
Modifica
module/Application/src/Controller/IndexController.php
, agrega el constructor para la inyección y los métodosmysqlAddAction
ymysqlAction
: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
75Crea las vistas
Archivo:
module/Application/view/application/index/mysql-add.phtml
php<h1><?php echo $this->message; ?></h1>
1Archivo:
module/Application/view/application/index/mysql.phtml
php<h1>Usuarios MySQL</h1> <pre><?php echo $this->users; ?></pre>
1
2Probar el ejemplo MySQL
Activa el servicio MySQL en ServBay. Accede primero a
https://servbay-zend-test.local/mysql-add
para agregar un usuario. Verás el mensaje de éxito "Usuario MySQL agregado correctamente". Luego ve ahttps://servbay-zend-test.local/mysql
para 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.php
cambiando 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
13Nota: 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
34Agrega 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
65Crea las vistas
Archivo:
module/Application/view/application/index/pgsql-add.phtml
php<h1><?php echo $this->message; ?></h1>
1Archivo:
module/Application/view/application/index/pgsql.phtml
php<h1>Usuarios PostgreSQL</h1> <pre><?php echo $this->users; ?></pre>
1
2Probar el ejemplo PostgreSQL
Activa el servicio PostgreSQL en ServBay. Accede primero a
https://servbay-zend-test.local/pgsql-add
para agregar un usuario y luego ahttps://servbay-zend-test.local/pgsql
para 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.json
de 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
9Ejecuta:
bashcomposer update
1ServBay 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
24Agrega 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
54Crea la vista
Archivo:
module/Application/view/application/index/memcached.phtml
php<h1>Ejemplo Memcached</h1> <p><?php echo $this->message; ?></p>
1
2Probar 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.json
de 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
10Ejecuta:
bashcomposer update
1ServBay incluye la extensión PHP
redis
por 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
24Agrega 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
56Crea la vista
Archivo:
module/Application/view/application/index/redis.phtml
php<h1>Ejemplo Redis</h1> <p><?php echo $this->message; ?></p>
1
2Probar 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.