ZF2 Crear un nuevo módulo II


Por ahora la creación y configuración de los módulos en ZF2 se hace manualmente, se espera que muy pronto ZF2 implemente ZFTool u otro componente parecido que pueda generar fácilmente los módulos desde la linea de comando como en ZF1.

En los siguientes 5 pasos describiré como puedes poner en marcha un módulo.

PASO 1

Descargar ZendSkeletonModule, el cual nos provee una plantilla con todo lo mínimo necesario para que nuestro módulo funcione.

La urls de descarga son:

PASO 2

Desempaquetamos el archivo ZendSkeletonApplication.zip o ZendSkeletonApplication.tar.gz dentro de la carpeta modules/ y lo renombramos: ejemplo MyModule/

Nuestra carpeta debería parecerse a esto:

PASO 3

Ahora toca renombrar carpetas y reemplazar ZendSkeletonModule; por MyModule dentro de los siguientes archivos:

> Cambiar las siguientes lineas de código en el archivo MyModule/module.php
[php class=”mark:10″ title=”MyModule/module.php”]

/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/ZendSkeletonModule for the canonical source repository
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

namespace MyModule; // <-- Línea Cambiada use Zend\ModuleManager\Feature\AutoloaderProviderInterface; use Zend\Mvc\ModuleRouteListener; class Module implements AutoloaderProviderInterface { public function getAutoloaderConfig() { [/php] > Cambiar las siguientes lineas de código en el archivo MyModule/config/module.config.php
[php class=”mark:5,14,18,47″ title=”MyModule/config/module.config.php”]

return array(
‘controllers’ => array(
‘invokables’ => array(
‘MyModule\\Controller\\Skeleton’ => ‘MyModule\\Controller\\SkeletonController’, // <-- Línea Cambiada ), ), 'router' => array(
‘routes’ => array(
‘module-name-here’ => array(
‘type’ => ‘Literal’,
‘options’ => array(
// Change this to something specific to your module
‘route’ => ‘/my-module’, // <-- Línea Cambiada 'defaults' => array(
// Change this value to reflect the namespace in which
// the controllers for your module are found
‘__NAMESPACE__’ => ‘MyModule\\Controller’,// <-- Línea Cambiada 'controller' => ‘Skeleton’,
‘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(
‘MyModule’ => __DIR__ . ‘/../view’, // <-- Línea Cambiada ), ), ); [/php] > Cambiar las siguientes lineas de código en el archivo MyModule/autoload_classmap.php
[php class=”mark:4,5,6,7″ title=”MyModule/autoload_classmap.php”]
// Generated by ZF2’s ./bin/classmap_generator.php
return array(
‘MyModule\\Module’ => __DIR__ . ‘/Module.php’,// <-- Línea Cambiada 'MyModule\\Controller\\SkeletonController' => __DIR__ . ‘/src/MyModule/Controller/SkeletonController.php’, // <-- Línea Cambiada 'MyModule\\Framework\\TestCase' => __DIR__ . ‘/tests/MyModule/Framework/TestCase.php’, // <-- Línea Cambiada 'MyModule\\SampleTest' => __DIR__ . ‘/tests/MyModule/SampleTest.php’, // <-- Línea Cambiada ); [/php] > Renombrar la carpeta MyModule/src/ZendSkeletonModule/ por MyModule/src/MyModule/

> Cambiar las siguientes lineas de código en el archivo MyModule/src/MyModule/Controller/SkeletonController.php
[php class=”mark:10″ title=”MyModule/src/MyModule/Controller/SkeletonController.php”]
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/ZendSkeletonModule for the canonical source repository
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

namespace MyModule\Controller; // <-- Línea Cambiada use Zend\Mvc\Controller\AbstractActionController; class SkeletonController extends AbstractActionController { public function indexAction() { return array(); } public function fooAction() { // This shows the :controller and :action parameters in default route // are working when you browse to /module-specific-root/skeleton/foo return array(); } } [/php] > Renombrar la carpeta MyModule/view/zend-skeleton-module por MyModule/view/my-module

En resuenen hemos renombrado las siguientes Carpetas:

  • MyModule/src/ZendSkeletonModule por MyModule/src/MyModule
  • MyModule/view/zend-skeleton-module por MyModule/view/my-module
  • MyModule/src/MyModule/ por MyModule/src/MyModule/

Y cambiado el contenido de los siguientes archivos :

  • MyModule/Module.php
  • MyModule/config/module.config.php
  • MyModule/autoload_classmap.php
  • MyModule/src/MyModule/Controller/SkeletonController.php
  • application.config.php

PASO 4

Le decimos a nuestra aplicación que tenemos un nuevo módulo y que ahora puede usarlo. para eso agregamos nuestro módulo al archivo application.config.php ubicado en zf2/config/application.config.php
[php class=”mark:5″ title=”zf2/config/application.config.php”]
array(
‘Application’,
‘MyModule’, // <-- linea añadida ), 'module_listener_options' => array(
‘config_glob_paths’ => array(
‘config/autoload/{,*.}{global,local}.php’,
),
‘module_paths’ => array(
‘./module’,
‘./vendor’,
),
),
);
[/php]

PASO 5

Verificamos que nuestro módulo este funcionando correctamente, escribiendo en nuestro navegador la url http://zf2.gn/my-module/ y nos debería mostrar esto


Espero que te haya sido de ayuda, quedo a la espera de tus comentarios

benjamin
Me llamo Benjamín Gonzales B, soy desarrollador de software con más de 15 años de experiencia, socio funduador de la empresa GNBIT. Me apasiona todo lo relacionado a las nuevas tecnologías, me gusta investigar , leer y aprender cada día algo nuevo. Desarrollo en PHP7+, JAVA, C#, JavaScript, entre otros y actualmente  estoy experimentando con lenguajes funcionales como: Erlang, Clojure y Scala 

16 Comments

  1. Gracias por los tutoriales, yo acabo de instalar ZF2 en windows xD todo bien 🙂 Y seguiré tus manuales están todos excelentes gracias 😀

    Espero que puedas tocar para configurar BD, layout y lo de sesion, porque en realidad ZF1 sabia lo básico, pero no se cuanto cambio ahora para poder hacer un sistema grande 🙂

    Eso gracias!!

    1. Hola Albert
      Me alegro que te haya servido los tutoriales , en los próximos días tocare esos temas.
      Suscribe al RSS del blog para que estes pendiente de lo nuevo.
      Saludos!

  2. Hola, muy bueno el tutorial. Hasta esta parte todo bien pero que sucedería si yo quisiera crear un modulo dentro de otro es decir:
    Yo tengo en mi aplicación un modulo llamado Herramientas y quiero que dentro del modulo Herramientas exista otro llamado Office2007.
    ¿Cómo quedaría la estructura de carpeta y la configuración de los ficheros Module.php y module.config.php?
    Espero su respuesta y gracias de antemano.

    1. Simple
      La estructura de tu directorio seria

      module/Tumodulo/
      ├── config
      ├── src
      │   └── Tumodulo
      │   ├── Controller
      ├── submodules
      │   └── Otromodulo
      │   ├── config
      │   ├── src
      │   │   └── Otromodulo
      │   │   └── Controller
      │   └── view
      └── view

      Y modificas el archivo application.config.php y debe quedar así


      'module_listener_options' => array(
      'module_paths' => array(
      './module',
      './vendor',
      './module/Tumodulo/submodules'
      ),
      'config_glob_paths' => array('config/autoload/{,*.}{global,local}.php')
      ),

      1. gracias por la respuesta he configurado tod eso pero como debo hacer para llamar eso desde la URL: porque de momento tengo el paquete de herramientas y cuando lo llamo todo bien (http://zf2/herramientas/index/holamundo) pero cuando llamo algo de un submodulo(http://zf2/herramientas/sub_herramienta/index/index) me dice:
        A 404 error occurred
        Page not found.
        The requested URL could not be matched by routing.
        No Exception available
        podrias decirme como solucionar eso.. y gracias nuevamente

  3. basándome en mi ejemplo tendrías que llamarlo así

    http://zf2/otromodulo/index/index

    Si deseas que la ruta sea

    http://zf2/mimodulo/otromodulo/index/index

    Tienes que modificar la ruta (router) en el archivo module.config.php

    1. Lo ideal sería que no metas un modulo dentro de otro modulo, lo que puedes hacer para que te quede mas limpio y organizado es ponerlo dentro de una carpeta contenedora, mas o menos así:

      module/herramientas/
      ├── Office2007
      ├── Office2003
      ├── Office98


      'module_paths' => array(
      './module',
      './vendor',
      './module/herramientas/'
      ),

      y dentro de module.config.php donde defines las rutas pondrías esto

      'options' => array(
      'route' => '/herramientas/office2008',
      'defaults' => array(
      '__NAMESPACE__' => 'Office2008\Controller',
      'controller' => 'Index',
      'action' => 'index',
      ),
      ),

      No lo he probado, pero en teoría debería funcionar

      1. Benjamin nuevamente gracias lo hice de esa manera y me funcionó al 100%. Me parece la manera mas óptima y organizada.

  4. Holam Benjamin, tengo un problema implemente este tutorial :
    http://www.jprumeau.com/2012/11/07/zf2-authentication/

    donde lo uso en un modulo admin, tengo dos modulos pero lo que sucede esque quiero q funcione la autentificacion solo en el modulo admin, pero no es asi esta apareciendo la pantalla de logeo en todos los modulos.

    Lo curioso esque ya lo habia resuelto, anteriormente habia declarado en el archivo global.php , luego lo puse en el archivo module.config.php del modulo admin y funciono pero luego cuando intente subir a produccion volvio a fallar en mi local.

    Estoy pensando q es un virus en mi pc, no estoy seguro.

    1. Hola
      Te recomendaría usar ZfcUser es mucho mejor, trabaja en un módulo aparte y lo puedes activar para toda la aplicación o solo para un módulo en particular.

      Sobre lo otro, no he probado su código, así que no se donde puede estar tu error

  5. Estimado, se que es un poco tarde para comentar pero, quería preguntarte que diferencia existe entre crear un modulo, usando el ZendSkeletonModule que copiando y modificando el modulo por defecto que nos trae el zend framework? osea copiar y renombrar y modificar el modulo llamado Application? existe diferencia?? Gracias de antemano por su respuesta 😀

    1. Hola Miguel
      Básicamente ninguna, es casi lo mismo, pero creo que a estas alturas, sería mucho mejor crear un módulo usando ZFTool, ya que te creará un módulo vació, el cual puedes acomodarlo a tu gusto

      Saludos!

Leave a Comment

Su dirección de correo no se hará público. Los campos requeridos están marcados *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.