Crear y ejecutar un proyecto Zend Framework
¿Qué es Zend Framework?
Zend Framework es un marco PHP de código abierto que proporciona un conjunto de bibliotecas orientadas a objetos para construir aplicaciones y servicios web modernos. Es conocido por su diseño modular y alto rendimiento, adecuado para proyectos empresariales de pequeña a gran escala.
Características y ventajas principales de Zend Framework
- Diseño modular: Zend Framework utiliza un diseño modular que permite a los desarrolladores seleccionar y usar componentes según sus necesidades.
- Alto rendimiento: A través de una arquitectura optimizada y mecanismos de caché, Zend Framework ofrece un rendimiento excepcional.
- Flexibilidad: Puede integrarse con múltiples bibliotecas y extensiones de terceros, adecuado para proyectos de cualquier tamaño.
- Soporte comunitario: Tiene una gran comunidad de desarrolladores y un ecosistema rico.
- Buena documentación: Proporciona documentación y tutoriales detallados para ayudar a los desarrolladores a comenzar rápidamente.
Zend Framework es adecuado para construir aplicaciones web y API de alta calidad, compatible con proyectos desde aplicaciones pequeñas hasta sistemas empresariales de gran escala.
Crear y ejecutar un proyecto Zend Framework usando ServBay
En este artículo, utilizaremos el entorno PHP proporcionado por ServBay para crear y ejecutar un proyecto Zend Framework. Utilizaremos la función 'host' de ServBay para configurar el servidor web y acceder al proyecto a través de una configuración sencilla.
Atención: si alguna vez usaste NGINX o Apache
ServBay usa Caddy como servidor web por defecto. Para usuarios que estén migrando desde NGINX y Apache a ServBay, hay algunos cambios clave a considerar:
Configuración de Caddy
ServBay ya tiene Caddy incorporado y configurado por defecto. Los desarrolladores pueden gestionar los sitios a través de la función 'host' de ServBay sin necesidad de modificar manualmente los archivos de configuración de Caddy.
Reglas de reescritura y .htaccess
En NGINX y Apache, los desarrolladores típicamente escriben sus propias reglas de reescritura y archivos .htaccess para manejar la reescritura de URL y otras configuraciones. Sin embargo, ServBay ya tiene configuradas las reglas de Caddy, por lo que, a menos que haya necesidades especiales, los desarrolladores no necesitan escribir estos archivos manualmente.
Más información
Para más información, consulte Rewrite y htaccess, Migrar sitios Apache a ServBay, Migrar sitios NGINX a ServBay.
Crear un proyecto Zend Framework
TIP
ServBay recomienda a los desarrolladores colocar los sitios web en el directorio /Applications/ServBay/www
para facilitar la gestión.
Instalar Composer
ServBay ya tiene Composer incorporado, por lo que no es necesario instalarlo por separado.
Crear un proyecto Zend Framework
Usar Composer para crear un nuevo proyecto Zend Framework:
bashcd /Applications/ServBay/www mkdir servbay-zend-app cd servbay-zend-app composer create-project zendframework/skeleton-application .
1
2
3
4Acceder al directorio del proyecto
Ir al directorio del proyecto Zend Framework recién creado:
bashcd /Applications/ServBay/www/servbay-zend-app
1
Configuración inicial
Configurar variables de entorno
Configurar la información de conexión a la base de datos y otras variables de entorno en el archivo
config/autoload/global.php
. Asegúrate de que la siguiente configuración esté correcta:phpreturn [ 'db' => [ 'driver' => 'Pdo_Mysql', 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', 'hostname' => '127.0.0.1', ], ];
1
2
3
4
5
6
7
8
9
Configurar el servidor web
Usar la función 'host' de ServBay para acceder al proyecto Zend Framework a través del servidor web. En la configuración del 'host' de ServBay, agregar un nuevo host:
- Nombre:
My First Zend Dev Site
- Dominio:
servbay-zend-test.local
- Tipo de sitio web:
PHP
- Versión de PHP: elegir
8.3
- Directorio raíz del sitio web:
/Applications/ServBay/www/servbay-zend-app/public
Para pasos detallados sobre la configuración, consulta Agregar un primer sitio web.
Agregar código de ejemplo
Agregar el siguiente código en el archivo module/Application/config/module.config.php
para mostrar "Hello ServBay!":
return [
'router' => [
'routes' => [
'home' => [
'type' => 'Literal',
'options' => [
'route' => '/',
'defaults' => [
'controller' => 'Application\Controller\Index',
'action' => 'index',
],
],
],
],
],
'controllers' => [
'factories' => [
'Application\Controller\Index' => InvokableFactory::class,
],
],
'view_manager' => [
'template_path_stack' => [
__DIR__ . '/../view',
],
],
];
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
Agregar el siguiente código en el archivo module/Application/src/Controller/IndexController.php
:
namespace Application\Controller;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
class IndexController extends AbstractActionController
{
public function indexAction()
{
return new ViewModel([
'message' => 'Hello ServBay!',
]);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
Agregar el siguiente código en el archivo module/Application/view/application/index/index.phtml
:
<?php echo $this->message; ?>
Acceder al sitio web
Abrir el navegador y visitar https://servbay-zend-test.local
, verás la salida Hello ServBay!
en la página web.
Ejemplo de base de datos NoSQL
Ejemplo con Memcached
Instalar la extensión Memcached
En ServBay, la extensión Memcached ya está preinstalada, no es necesario instalarla adicionalmente.
Configurar Memcached
Agregar la dependencia de Memcached en el archivo
composer.json
:json{ "require": { "laminas/laminas-cache-storage-adapter-memcached": "^2.0" } }
1
2
3
4
5Luego, correr
composer update
para instalar la dependencia.Configurar rutas
Agregar el siguiente código en el archivo
module/Application/config/module.config.php
:phpreturn [ 'router' => [ 'routes' => [ 'memcached' => [ 'type' => 'Literal', 'options' => [ 'route' => '/memcached', 'defaults' => [ 'controller' => 'Application\Controller\Index', 'action' => 'memcached', ], ], ], ], ], ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16Usar Memcached
Usar caché en el controlador:
phpnamespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Cache\StorageFactory; class IndexController extends AbstractActionController { public function memcachedAction() { $cache = StorageFactory::factory([ 'adapter' => [ 'name' => 'memcached', 'options' => [ 'servers' => [ ['127.0.0.1', 11211], ], ], ], ]); $cacheKey = 'my_cache_key'; $cachedData = $cache->getItem($cacheKey, $success); if (!$success) { $cachedData = 'Hello Memcached!'; $cache->setItem($cacheKey, $cachedData); } 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
34Agregar el siguiente código en el archivo
module/Application/view/application/index/memcached.phtml
:php<?php echo $this->message; ?>
1Abrir el navegador y visitar
https://servbay-zend-test.local/memcached
Ejemplo con Redis
Instalar la extensión Redis
En ServBay, la extensión Redis ya está preinstalada, no es necesario instalarla adicionalmente.
Configurar Redis
Agregar la dependencia de Redis en el archivo
composer.json
:json{ "require": { "laminas/laminas-cache-storage-adapter-redis": "^2.0" } }
1
2
3
4
5Luego, correr
composer update
para instalar la dependencia.Configurar rutas
Agregar el siguiente código en el archivo
module/Application/config/module.config.php
:phpreturn [ 'router' => [ 'routes' => [ 'redis' => [ 'type' => 'Literal', 'options' => [ 'route' => '/redis', 'defaults' => [ 'controller' => 'Application\Controller\Index', 'action' => 'redis', ], ], ], ], ], ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16Usar Redis
Usar caché en el controlador:
phpnamespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Cache\StorageFactory; class IndexController extends AbstractActionController { public function redisAction() { $cache = StorageFactory::factory([ 'adapter' => [ 'name' => 'redis', 'options' => [ 'server' => [ 'host' => '127.0.0.1', 'port' => 6379, ], ], ], ]); $cacheKey = 'my_cache_key'; $cachedData = $cache->getItem($cacheKey, $success); if (!$success) { $cachedData = 'Hello Redis!'; $cache->setItem($cacheKey, $cachedData); } 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
35Agregar el siguiente código en el archivo
module/Application/view/application/index/redis.phtml
:php<?php echo $this->message; ?>
1Abrir el navegador y visitar
https://servbay-zend-test.local/redis
Ejemplo de base de datos relacional
Crear la estructura de la base de datos y archivos de migración
Crear archivo de migración
Usar la herramienta Migrations de Laminas para crear un archivo de migración:
bashcomposer require laminas/laminas-db
1Editar archivo de migración
Crear un nuevo archivo de migración en el directorio
data/migrations
y editarlo para definir la estructura de la base de datos:phpuse Laminas\Db\Adapter\Adapter; use Laminas\Db\Sql\Sql; class CreateUsersTable { public function up(Adapter $adapter) { $sql = new Sql($adapter); $create = $sql->createTable('users') ->addColumn('id', 'integer', ['auto_increment' => true]) ->addColumn('name', 'varchar', ['length' => 255]) ->addColumn('email', 'varchar', ['length' => 255, 'unique' => true]) ->addPrimaryKey('id'); $adapter->query( $sql->buildSqlString($create), Adapter::QUERY_MODE_EXECUTE ); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20Ejecutar la migración
Ejecutar manualmente la migración para crear las tablas en la base de datos:
php$adapter = new Adapter([ 'driver' => 'Pdo_Mysql', 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', 'hostname' => '127.0.0.1', ]); $migration = new CreateUsersTable(); $migration->up($adapter);
1
2
3
4
5
6
7
8
9
10
Ejemplo con MySQL
Configurar MySQL
Configurar la información de conexión en el archivo
config/autoload/global.php
:phpreturn [ 'db' => [ 'driver' => 'Pdo_Mysql', 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', 'hostname' => '127.0.0.1', ], ];
1
2
3
4
5
6
7
8
9Configurar rutas
Agregar el siguiente código en el archivo
module/Application/config/module.config.php
:phpreturn [ 'router' => [ 'routes' => [ 'mysql-add' => [ 'type' => 'Literal', 'options' => [ 'route' => '/mysql-add', 'defaults' => [ 'controller' => 'Application\Controller\Index', 'action' => 'mysqlAdd', ], ], ], 'mysql' => [ 'type' => 'Literal', 'options' => [ 'route' => '/mysql', 'defaults' => [ 'controller' => 'Application\Controller\Index', 'action' => 'mysql', ], ], ], ], ], ];
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
26Escribir datos del usuario
Escribir datos del usuario en el controlador:
phpnamespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Db\Adapter\Adapter; use Laminas\Db\Sql\Sql; class IndexController extends AbstractActionController { protected $adapter; public function __construct(Adapter $adapter) { $this->adapter = $adapter; } public function mysqlAddAction() { $sql = new Sql($this->adapter); $insert = $sql->insert('users') ->values([ 'name' => 'ServBay', 'email' => '[email protected]', ]); $this->adapter->query( $sql->buildSqlString($insert), Adapter::QUERY_MODE_EXECUTE ); return new ViewModel([ 'message' => 'User added', ]); } public function mysqlAction() { $sql = new Sql($this->adapter); $select = $sql->select('users'); $result = $this->adapter->query( $sql->buildSqlString($select), Adapter::QUERY_MODE_EXECUTE ); $users = []; foreach ($result as $row) { $users[] = $row; } return new ViewModel([ 'users' => json_encode($users), ]); } }
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
55Agregar el siguiente código en el archivo
module/Application/view/application/index/mysql-add.phtml
:php<?php echo $this->message; ?>
1Agregar el siguiente código en el archivo
module/Application/view/application/index/mysql.phtml
:php<?php echo $this->users; ?>
1Abrir el navegador y visitar
https://servbay-zend-test.local/mysql-add
yhttps://servbay-zend-test.local/mysql
Ejemplo con PostgreSQL
Configurar PostgreSQL
Configurar la información de conexión en el archivo
config/autoload/global.php
:phpreturn [ 'db' => [ 'driver' => 'Pdo_Pgsql', 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', 'hostname' => '127.0.0.1', ], ];
1
2
3
4
5
6
7
8
9Configurar rutas
Agregar el siguiente código en el archivo
module/Application/config/module.config.php
:phpreturn [ 'router' => [ 'routes' => [ 'pgsql-add' => [ 'type' => 'Literal', 'options' => [ 'route' => '/pgsql-add', 'defaults' => [ 'controller' => 'Application\Controller\Index', 'action' => 'pgsqlAdd', ], ], ], 'pgsql' => [ 'type' => 'Literal', 'options' => [ 'route' => '/pgsql', 'defaults' => [ 'controller' => 'Application\Controller\Index', 'action' => 'pgsql', ], ], ], ], ], ];
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
26Escribir datos del usuario
Escribir datos del usuario en el controlador:
phpnamespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Db\Adapter\Adapter; use Laminas\Db\Sql\Sql; class IndexController extends AbstractActionController { protected $adapter; public function __construct(Adapter $adapter) { $this->adapter = $adapter; } public function pgsqlAddAction() { $sql = new Sql($this->adapter); $insert = $sql->insert('users') ->values([ 'name' => 'ServBay', 'email' => '[email protected]', ]); $this->adapter->query( $sql->buildSqlString($insert), Adapter::QUERY_MODE_EXECUTE ); return new ViewModel([ 'message' => 'User added', ]); } public function pgsqlAction() { $sql = new Sql($this->adapter); $select = $sql->select('users'); $result = $this->adapter->query( $sql->buildSqlString($select), Adapter::QUERY_MODE_EXECUTE ); $users = []; foreach ($result as $row) { $users[] = $row; } return new ViewModel([ 'users' => json_encode($users), ]); } }
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
55Agregar el siguiente código en el archivo `module/Application/view/application/index/pgsql