Crear y ejecutar un proyecto Zend Framework (Laminas) en ServBay
Descripción general
Zend Framework (ahora parte del Laminas Project) es un potente framework de código abierto para PHP, que ofrece un conjunto de componentes orientados a objetos de alta calidad para construir aplicaciones y servicios web modernos. Es reconocido por su flexibilidad, diseño modular y alto rendimiento, lo que lo convierte en una opción ideal tanto para sitios web simples como para aplicaciones empresariales complejas.
ServBay es un entorno local de desarrollo web para macOS, que integra PHP, distintos servidores web (como Caddy y Nginx), bases de datos (MySQL, PostgreSQL, MongoDB), servicios de caché (Redis, Memcached) y otras herramientas. Con ServBay, configurar y gestionar estos paquetes es sencillo, permitiéndote montar y ejecutar proyectos PHP locales sin complicaciones.
Esta documentación te guiará paso a paso para crear y ejecutar un proyecto Zend Framework (Laminas) dentro de ServBay e integrarlo con las bases de datos y servicios de caché que ofrece.
Requisitos previos
Antes de comenzar, asegúrate de haber completado los siguientes pasos:
- Instalar ServBay: Ten ServBay instalado y funcionando en tu sistema macOS. Si aún no lo has hecho, visita el sitio oficial de ServBay para obtener la guía de descarga e instalación.
- Paquetes de ServBay: Verifica que tienes instalados y activos los paquetes necesarios, entre ellos:
- Al menos una versión de PHP (recomendado PHP 8.x o superior, ya que las versiones modernas de Zend Framework/Laminas lo requieren).
- Un servidor web (Caddy o Nginx).
- Composer (normalmente incluido en ServBay).
- Las bases de datos y servicios de caché que vayas a utilizar (por ejemplo, MySQL, PostgreSQL, Memcached y/o Redis). Puedes iniciar estos servicios fácilmente desde el panel de control de ServBay.
Crear un proyecto Zend Framework
Se recomienda almacenar todos tus proyectos web en el directorio /Applications/ServBay/www
. Esto facilita la gestión automática de sitios web por parte de ServBay.
Ir al directorio raíz de sitios web
Abre la terminal y navega al directorio raíz recomendado:
bashcd /Applications/ServBay/www
1Crear el proyecto con Composer
Composer ya viene preinstalado con ServBay. Usa el comando
create-project
de Composer para crear una nueva aplicación base de Zend Framework (Laminas skeleton application) en el subdirectorioservbay-zend-app
:bashcomposer create-project laminas/laminas-skeleton-application servbay-zend-app
1Esto descargará la aplicación base de Zend Framework (Laminas) en
servbay-zend-app
e instalará todas las dependencias necesarias.Entra en el directorio del proyecto
Navega al directorio recién creado:
bashcd servbay-zend-app
1
Configuración del servidor web
Para acceder a tu proyecto Zend Framework mediante el navegador, necesitarás configurar un sitio web en ServBay.
- Abrir el panel de control de ServBay: Inicia la aplicación ServBay.
- Ir a ajustes de sitios: En el panel, localiza y haz clic en la pestaña Sitios web (Websites).
- Agregar un nuevo sitio: Haz clic sobre el botón
+
en la esquina inferior izquierda para crear una nueva configuración de sitio web. - Completa la información del sitio:
- Nombre (Name): Elige un nombre descriptivo, por ejemplo,
My Zend Dev Site
. - Dominio (Domain): Ingresa el dominio local que usarás en el navegador, preferentemente con sufijo
.local
o.test
para evitar conflictos con dominios reales, por ejemplo,servbay-zend-test.local
. ServBay configurará automáticamente la resolución DNS local. - Tipo de sitio web (Website Type): Selecciona
PHP
. - Versión de PHP (PHP Version): Elige la versión de PHP para este sitio (ejemplo:
8.3
). Asegúrate de que esté instalada y activa en ServBay. - Raíz del sitio web (Document Root): Zend Framework utiliza
public
como carpeta de entrada (donde estáindex.php
). Configura la raíz como/Applications/ServBay/www/servbay-zend-app/public
.
- Nombre (Name): Elige un nombre descriptivo, por ejemplo,
- Guardar y reiniciar: Haz clic en Guardar (Save). Confirma para aplicar los cambios; el servidor web se recargará y el sitio estará activo.
Consulta más detalles en la sección sobre cómo agregar tu 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 el mensaje "Hello ServBay!".
Configura la ruta y el controlador (module.config.php)
Edita el archivo
module/Application/config/module.config.php
y asegúrate de tener la configuración básica de rutas y controladores: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 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 bloque es parte del archivo
module.config.php
. Combínalo con tu configuración existente. Asegúrate de incluir la ruta'home'
y la definición de fábrica paraController\IndexController::class
.Crear o modificar el controlador (IndexController.php)
Edita o crea el archivo
module/Application/src/Controller/IndexController.php
, y asegura que el métodoindexAction
devuelva 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() { // Devuelve un ViewModel y pasa la variable 'message' a la vista return new ViewModel([ 'message' => 'Hello ServBay!', ]); } // ... otros métodos action }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24Crear o modificar la vista (index.phtml)
Edita o crea el archivo
module/Application/view/application/index/index.phtml
para mostrar el mensaje recibido:php<h1><?php echo $this->message; ?></h1>
1Aquí se usa el ayudante de vista
$this->message
de Zend Framework (Laminas) para acceder al dato proveniente del controlador.
Acceso al sitio web
Abre el navegador y visita el dominio configurado, por ejemplo: https://servbay-zend-test.local
.
Si todo está correcto, verás la página mostrando Hello ServBay!
, lo que confirma que el proyecto Zend Framework está corriendo satisfactoriamente en ServBay.
Ejemplos de integración con bases de datos y caché
ServBay proporciona múltiples servicios de bases de datos y caché. A continuación verás ejemplos de cómo conectar y utilizar Memcached, Redis, MySQL y PostgreSQL desde un proyecto Zend Framework.
Nota importante: Estos ejemplos son demostrativos y funcionan de manera independiente. En un entorno real, elegirás la base de datos y los servicios de caché según tus necesidades, gestionando las conexiones mediante inyección de dependencias, etc. Debes tener los servicios necesarios activos en ServBay (MySQL, PostgreSQL, Memcached, Redis) para ejecutar estos ejemplos.
Ejemplo de interacción con la base de datos - Crear una tabla
Primero veremos cómo interactuar con la base de datos usando el componente Laminas DB para crear una tabla sencilla, mostrando el proceso manualmente (sin emplear Laminas Migrations).
Instalar Laminas DB
En el directorio raíz del proyecto, instala el componente DB:
bashcomposer require laminas/laminas-db
1Crear la base de datos manualmente
Antes de ejecutar los ejemplos, crea manualmente una base de datos llamada
servbay_zend_app
desde la herramienta administrativa de tu elección (phpMyAdmin, pgAdmin, MongoDB Compass, etc.). En ServBay, los datos de acceso por defecto para MySQL/MariaDB son usuarioroot
y contraseñapassword
; para PostgreSQL igual.Definir y ejecutar el script para crear la tabla (ejemplo)
Crea un archivo PHP (por ejemplo,
create_users_table.php
) en la raíz del proyecto con el siguiente código para definir y crear la tablausers
:php<?php // create_users_table.php use Laminas\Db\Adapter\Adapter; use Laminas\Db\Sql\Sql; // Suponiendo uso de MySQL o MariaDB $adapter = new Adapter([ 'driver' => 'Pdo_Mysql', // o 'Pdo_Pgsql' 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', // Contraseña predeterminada en ServBay 'hostname' => '127.0.0.1', // 'port' => 3306, // Puerto predeterminado de MySQL // 'port' => 5432, // Puerto predeterminado de PostgreSQL ]); $sql = new Sql($adapter); // Definir SQL para crear 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 "Executing 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 "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
38Nota: Este script es ilustrativo y ejecuta el proceso manual. En la práctica, gestiona los esquemas con Laminas Migrations.
Ejecútalo desde terminal con PHP CLI (colócate en la raíz de tu proyecto o indica el path adecuado):
bashphp create_users_table.php
1
Ejemplo de integración con MySQL
Explicación de cómo conectar y consultar datos en MySQL desde un controlador de Zend Framework.
Configurar la conexión a la base de datos
Edita
config/autoload/global.php
para definir los datos de conexión a MySQL:php<?php // config/autoload/global.php return [ 'db' => [ 'driver' => 'Pdo_Mysql', 'database' => 'servbay_zend_app', // Asegúrate que exista la base 'username' => 'root', // Usuario por defecto de ServBay 'password' => 'password', // Contraseña predeterminada 'hostname' => '127.0.0.1', 'port' => 3306, // Puerto por defecto de MySQL 'charset' => 'utf8mb4', ], // ... otras configuraciones globales ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14Configurar la fábrica del controlador (module.config.php)
Para inyectar el
Laminas\Db\Adapter\Adapter
al controlador, define una fábrica en la seccióncontrollers
demodule/Application/config/module.config.php
. Si ya tienes una definición conInvokableFactory
, sustitúyela de la siguiente forma:php<?php // module/Application/config/module.config.php namespace Application; use Laminas\ServiceManager\Factory\InvokableFactory; // Mantén si lo usas en otros lugares use Laminas\Db\Adapter\AdapterInterface; return [ // ... otras configuraciones 'controllers' => [ 'factories' => [ Controller\IndexController::class => function($container) { // Obtiene el adaptador de base de datos del Service Manager $adapter = $container->get(AdapterInterface::class); // Retorna la instancia del controlador con el adaptador inyectado return new Controller\IndexController($adapter); }, // Otros controladores si lo necesitas ], ], '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
29
30Nota: Mezcla esta sección con tu archivo, asegurando la definición de
service_manager
y los aliases contemplados.Configurar rutas (module.config.php)
Añade las rutas para los ejemplos de MySQL en
module/Application/config/module.config.php
:php<?php // module/Application/config/module.config.php namespace Application; use Laminas\Router\Http\Literal; // ... otros use return [ 'router' => [ 'routes' => [ // ... rutas existentes (como '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
35Inserta estas rutas dentro del subarray
'routes'
.Agregar los métodos al controlador (IndexController.php)
Edita
module/Application/src/Controller/IndexController.php
. Añade el constructor e implementa los métodos para MySQL: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; // Constructor para recibir el adaptador public function __construct(AdapterInterface $adapter) { $this->adapter = $adapter; } /** * Acción por defecto (Hola ServBay!). */ public function indexAction() { return new ViewModel([ 'message' => 'Hello ServBay!', ]); } /** * Agrega un usuario a la tabla 'users' vía MySQL. */ public function mysqlAddAction() { $sql = new Sql($this->adapter); $insert = $sql->insert('users') ->values([ 'name' => 'ServBay Demo User', 'email' => '[email protected]', ]); $statement = $sql->prepareStatementForSqlObject($insert); $result = $statement->execute(); // Devuelve un mensaje según el resultado $message = $result->getAffectedRows() > 0 ? 'Usuario MySQL añadido correctamente.' : 'No se pudo añadir el usuario MySQL.'; return new ViewModel([ 'message' => $message, ]); } /** * Obtiene todos los usuarios de 'users' vía 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; } // Pasa los resultados como JSON 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
76
77
78Crear los archivos de vista
Crea el archivo
module/Application/view/application/index/mysql-add.phtml
:php<h1><?php echo $this->message; ?></h1>
1Crea el archivo
module/Application/view/application/index/mysql.phtml
:php<h1>Usuarios MySQL</h1> <pre><?php echo $this->users; ?></pre>
1
2Probar el ejemplo de MySQL
Asegúrate de que el servicio MySQL esté ejecutándose en ServBay. Visita primero
https://servbay-zend-test.local/mysql-add
para añadir un usuario. Deberías ver "Usuario MySQL añadido correctamente.". Luego visitahttps://servbay-zend-test.local/mysql
para consultar los usuarios en la tabla (en formato JSON).
Ejemplo de integración con PostgreSQL
Demostración de cómo conectar y consultar datos en PostgreSQL.
Configura la conexión
Edita
config/autoload/global.php
para asignar la configuración de PostgreSQL. Nota: Si deseas trabajar con ambos motores de base al mismo tiempo, necesitarás lógica adicional para la selección de configuración.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
13Configurar la fábrica del controlador
(Igual al ejemplo de MySQL.) Si ya actualizaste la fábrica para inyectar el adapter, no debes hacer cambios aquí.
Configurar rutas (module.config.php)
Agrega las rutas para los ejemplos de PostgreSQL:
php<?php // module/Application/config/module.config.php namespace Application; use Laminas\Router\Http\Literal; // ... otros use return [ 'router' => [ 'routes' => [ // ... otras rutas '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
35Agregar métodos al controlador
En
module/Application/src/Controller/IndexController.php
añade los métodos: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 /** * Agrega usuario a 'users' vía PostgreSQL. */ public function pgsqlAddAction() { $sql = new Sql($this->adapter); $insert = $sql->insert('users') ->values([ 'name' => 'ServBay Demo User', 'email' => '[email protected]', ]); $statement = $sql->prepareStatementForSqlObject($insert); $result = $statement->execute(); $message = $result->getAffectedRows() > 0 ? 'Usuario PostgreSQL añadido correctamente.' : 'No se pudo añadir el usuario PostgreSQL.'; return new ViewModel([ 'message' => $message, ]); } /** * Consulta todos los usuarios vía 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
65Crear las vistas
Crea el archivo
module/Application/view/application/index/pgsql-add.phtml
:php<h1><?php echo $this->message; ?></h1>
1Crea el archivo
module/Application/view/application/index/pgsql.phtml
:php<h1>Usuarios PostgreSQL</h1> <pre><?php echo $this->users; ?></pre>
1
2Prueba el ejemplo de PostgreSQL
Activa PostgreSQL en ServBay. Visita
https://servbay-zend-test.local/pgsql-add
para añadir un usuario yhttps://servbay-zend-test.local/pgsql
para ver los registros (deberían mostrarse en formato JSON).
Ejemplo de integración con Memcached
Usando Memcached como caché de datos desde un controlador en Zend Framework.
Instalar el adaptador de Memcached
En
composer.json
, agrega la dependencia:json// composer.json { "require": { "laminas/laminas-skeleton-application": "^1.0", "laminas/laminas-cache-storage-adapter-memcached": "^2.0" // ... otros paquetes }, // ... resto de la configuración }
1
2
3
4
5
6
7
8
9Luego ejecuta:
bashcomposer update
1El paquete
memcached
de PHP ya está instalado en ServBay, no necesitas instalarlo extra.Configura la ruta (module.config.php)
Agrega la ruta para el ejemplo de Memcached:
php<?php // module/Application/config/module.config.php namespace Application; use Laminas\Router\Http\Literal; // ... otros use return [ 'router' => [ 'routes' => [ // ... otras rutas '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
25Agregar el método en el controlador
Añade el método
memcachedAction
enIndexController.php
: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 { // ... otros métodos /** * Demostración de uso de Memcached. */ public function memcachedAction() { // Instancia de caché Memcached; ServBay lo 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! (Dato original, guardado en caché el ' . 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
53Crear la vista
Crea
module/Application/view/application/index/memcached.phtml
:php<h1>Ejemplo Memcached</h1> <p><?php echo $this->message; ?></p>
1
2Probar el ejemplo de Memcached
Activa el servicio Memcached en ServBay. Accede a
https://servbay-zend-test.local/memcached
. Al primer acceso, verás "CACHE MISS"; durante los siguientes 300 segundos, verás "CACHE HIT" y el mismo timestamp.
Ejemplo de integración con Redis
Empleando Redis para almacenamiento de caché o datos con Zend Framework.
Instalar el adaptador de Redis
Agrega la dependencia en
composer.json
:json// composer.json { "require": { "laminas/laminas-skeleton-application": "^1.0", "laminas/laminas-cache-storage-adapter-redis": "^2.0", "ext-redis": "*" }, // ... otras configuraciones }
1
2
3
4
5
6
7
8
9Luego ejecuta:
bashcomposer update
1El paquete
redis
para PHP ya está incluido con ServBay.Configura la ruta (module.config.php)
Añade la ruta para Redis:
php<?php // module/Application/config/module.config.php namespace Application; use Laminas\Router\Http\Literal; // ... otros use return [ 'router' => [ 'routes' => [ // ... otras rutas '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
25Agregar método al controlador
Añade el método
redisAction
enIndexController.php
: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 { // ... otros métodos /** * Demostración de uso de Redis. */ public function redisAction() { // Instancia de almacenamiento Redis; por defecto ServBay usa 127.0.0.1:6379 $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! (Dato original, guardado en caché el ' . 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
54Crear la vista
Crea
module/Application/view/application/index/redis.phtml
:php<h1>Ejemplo Redis</h1> <p><?php echo $this->message; ?></p>
1
2Probar el ejemplo de Redis
Activa Redis en ServBay. Accede a
https://servbay-zend-test.local/redis
. Al primer acceso verás "CACHE MISS". Durante 300 segundos, verás "CACHE HIT" con el mismo timestamp.
Conclusión
Siguiendo estos pasos, has logrado crear, configurar y ejecutar un proyecto Zend Framework (Laminas) en tu entorno local con ServBay. Aprendiste cómo apuntar la configuración del servidor web al directorio público del proyecto y cómo integrar las bases de datos MySQL, PostgreSQL y los sistemas de caché Memcached y Redis proporcionados por ServBay.
ServBay simplifica la instalación y administración del entorno de desarrollo, permitiéndote concentrarte en el código y acelerar el ciclo de desarrollo. Aprovecha la variedad de paquetes y la flexibilidad en la configuración de ServBay para simular entornos de producción locales y aumentar tu productividad.