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:
- Zip: https://github.com/zendframework/ZendSkeletonModule/zipball/master
- Tarball: https://github.com/zendframework/ZendSkeletonModule/tarball/master
- Git:
>git clone git://github.com/zendframework/ZendSkeletonModule.git
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
porMyModule/src/MyModule
MyModule/view/zend-skeleton-module
porMyModule/view/my-module
MyModule/src/MyModule/
porMyModule/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
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!!
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!
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.
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')
),
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
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
Benjamín muchas gracias me fue de mucha ayuda lo hice modificando el fichero de configuracion global y me funciono a traves de la URL http://zf2/otromodulo/index/index porque lo trate de hacer para acceder de la la otra forma y nada pero bueno ya voy trabajando asi…
Gracias
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
Benjamin nuevamente gracias lo hice de esa manera y me funcionó al 100%. Me parece la manera mas óptima y organizada.
genial! que bueno que te haya servido!
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.
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
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 😀
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!