miércoles, 1 de octubre de 2014

Creando un módulo con Zend Framework 2

La arquitectura Modelo-Controlador-Vista intenta separar la capa de datos (Modelo) de su representación (Vista), y la capa que gestiona las relaciones entre ambas son los Controladores. Dicho de forma sencilla, nuestra aplicación sólo ejecutará acciones de los controladores, las cuales instanciaran modelos de datps de los que extraerán datos que posteriormente pasarán a las vistas para su representación.

La estructura básica de una URL en ZF2 es:
http://app/módulo/controlador/acción/parámetros

Recordemos que el uso de módulos nos permite segmentar el código, haciendo que sea más fácil de mantener y distribuir.
En la estructura de un módulo encontraremos tres carpetas imprescindibles:
  • config: donde se ubicarán los ficheros de configuración del módulo.
  • src: aquí encontraremos los controladores del módulo.
  • view: las vistas y layouts que nos determinaran la salida HTML.
Posteriormente podremos añadir otras carpetas de más interés como diccionarios, plugins, etc.

La creación de un módulo es tan sencilla como la creación de una aplicación, descargaremos el esqueleto base de un módulo desde el repositorio git de Zend Framework, como ejemplo crearemos un módulo llamado Menus:

cd /path_project/module
git clone git://github.com/zendframework/ZendSkeletonModule.git Menus

Este paso nos permitirá crear toda la estructura de directorios básica. Por defecto el esqueleto básico nos trae un controlador llamado ZendSkeletonModule con sus vistas asociadas. Para poder hacer accesible el nuevo módulo creado debemos incluirlo en el fichero /config/application.config.php de nuestra aplicación:

<?php
return array(
    // This should be an array of module namespaces used in the application.
    'modules' => array(
        'Application', 'Menus',
    ),

    // These are various options for the listeners attached to the ModuleManager
    'module_listener_options' => array(
        'module_paths' => array(
            './module',
            './vendor','./module',
        ),

        'config_glob_paths' => array(
            'config/autoload/{,*.}{global,local}.php',
        ),
    ),
);

En el módulo descargado desde git hemos de realizar algunas correcciones para adaptarlo al nombre que le hemos dado.
Fichero /module/Menus/Module.php:
...
namespace Menus;
..

Fichero /module/Menus/config/module.config.php sustituir cada ocurrencia de "ZendSkeletonModule" por "Menus" al igual que "module-specific-root" por "menus". Así mismo redefiniremos el controlador por "Index" en lugar de "SkeletonController":

<?php
return array(
    'controllers' => array(
        'invokables' => array(
            'Menus\Controller\Index' => 'Menus\Controller\Index',
        ),
    ),
    'router' => array(
        'routes' => array(
            'module-name-here' => array(
                'type'    => 'Literal',
                'options' => array(
                    // Change this to something specific to your module
                    'route'    => '/menus',
                    'defaults' => array(
                        // Change this value to reflect the namespace in which
                        // the controllers for your module are found
                        '__NAMESPACE__' => 'Menus\Controller',
                        'controller'    => 'Index',
                        'action'        => 'index',
                    ),
                ),
                'may_terminate' => true,
                'child_routes' => array(
                    // This route is a sane default when developing a module;
                    // as you solidify the routes for your module, however,
                    // you may want to remove it and replace it with more
                    // specific routes.
                    'default' => array(
                        'type'    => 'Segment',
                        'options' => array(
                            'route'    => '/[:controller[/:action]]',
                            'constraints' => array(
                                'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                                'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                            ),
                            'defaults' => array(
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),
    'view_manager' => array(
        'template_path_stack' => array(
            'Menus' => __DIR__ . '/../view',
        ),
    ),
);

Renombraremos la carpeta /module/Menus/src/ZendSkeletonModule por /module/Menus/src/Menus.
Renombraremos la carpeta /module/Menus/view/zend-skeleton-module por /module/Menus/view/menus.
Renombraremos la carpeta  /module/Menus/view/menus/skeleton por /module/Menus/view/menus/index.
Finalmente renombraremos el fichero /module/Menus/src/Menus/Controller/SkeletonController.php por /module/Menus/src/Menus/Controller/Index.php

Una vez hecho podemos invocar cualquiera de las acciones por defecto que han sido creadas en nuestro módulo:
http://localhost/myApp/menus
http://localhost/myApp/menus/index/foo


Ya hemos creado nuestro primer módulo en Zf2, el siguiente paso es dotarlo de funcionalidad.

No hay comentarios:

Publicar un comentario