lunes, 22 de julio de 2013

Configurando el módulo. URL amigables en Zend Framework 2


Si has estado siguiendo los capítulos anteriores sabrás que hemos estado realizando pruebas en el módulo "Application" que viene por defecto  en Skeleton, hemos creado un nuevo controlador llamado "demo", tres vistas "index", "fotos" y "musica" y hemos visto como manejar el  modelo ViewModel(), pero apenas hemos visto nada sobre como configurar el módulo, salvo cuando incluimos el controlador "demo", ahora, en  esta ocasión veremos como reescribir las url's para hacerlas amigables, para ello abriremos el archivo de configuración del módulo ...

-module
    -Application
                  -config
           
Configurando el módulo. URL amigables en Zend Framework 2


Este archivo contiene una serie de clases que proporciona el modelo ZEND para determinadas tareas, la primera que podrás observar es "router", este modelo nos servirá para configurar el modo en que se reescriben las rutas del proyecto ...

     'router' => array(
        'routes' => array(
            'home' => array(
                'type' => 'Zend\Mvc\Router\Http\Literal',
                'options' => array(
                    'route'    => '/',
                    'defaults' => array(
                        'controller' => 'Application\Controller\Index',
                        'action'     => 'index',
                    ),
                ),
            ),
),
),
           
Si observas se va componiendo en arrays, si seguimos el orden router -> routes -> home.

En home es donde se configura el controlador-vista que será cargado por defecto.

en type se llama al modelo zend 'Zend\Mvc\Router\Http\Literal' para reescribir la url.

En options hay una serie de elementos como ...

"route" => "/" que está apuntando a la raiz, es decir, http://tutorial-zend.localhost/

En defaults se indica la ubicación tanto del controlador("controller") como de la vista("action") ...
 
  'controller' => 'Application\Controller\Index',
  'action'     => 'index',
 
Si abres el navegador http://tutorial-zend.localhost/ verás que por default se carga el index del controlador Index que viene por defecto en Skeleton.

Configurando el módulo. URL amigables en Zend Framework 2


Ahora vamos a cambiar ese index por el index del controlador Demo para que se cargue al inicio, en defaults cambiaremos ...

          'controller' => 'Application\Controller\Index',
                        'action'     => 'index',
                       
Por esto otro ...

          'controller' => 'Application\Controller\Demo',
                        'action'     => 'index',
 
 
  Vuelve a recargar la página ...
 
 
Configurando el módulo. URL amigables en Zend Framework 2
 
  Como se puede ver la página inicio que ha sido cargada es la vista "index" del controlador "Demo", bien pero ahora queremos que todas las url's de las vistas sean amigables, es decir en lugar de mostrarnos la url de la vista fotos así -> http://tutorial-zend.localhost/application/demo/fotos,  queremos que la muestre así -> http://tutorial-zend.localhost/fotos
 
  Observa el siguiente código ...
 
              'home' => array(
                'type' => 'Zend\Mvc\Router\Http\Literal',
                'options' => array(
                    'route'    => '/',
                    'defaults' => array(
                        'controller' => 'Application\Controller\Demo',
                        'action'     => 'index',
                    ),
                ),
            ),
             /*------------------------------------------------*/
                      'fotos' => array(
                'type' => 'Zend\Mvc\Router\Http\Literal',
                'options' => array(
                    'route'    => '/fotos',
                    'defaults' => array(
                        'controller' => 'Application\Controller\Demo',
                        'action'     => 'fotos',
                    ),
                ),
            ),
            /*-------------------------------------------------*/
                       'musica' => array(
                'type' => 'Zend\Mvc\Router\Http\Literal',
                'options' => array(
                    'route'    => '/musica',
                    'defaults' => array(
                        'controller' => 'Application\Controller\Demo',
                        'action'     => 'musica',
                    ),
                ),
            ),
            /*-------------------------------------------------*/
                   
Estamos diciéndole a Zend que nos cargue como página de inicio la vista index ...

 http://tutorial-zend.localhost/
                
Y que nos cargue las otras dos vistas a través de su nombre: fotos, musica ...

http://tutorial-zend.localhost/fotos
http://tutorial-zend.localhost/musica  

El código completo de module.config.php es el siguiente ...

 array(

        'routes' => array(

            'home' => array(

                'type' => 'Zend\Mvc\Router\Http\Literal',

                'options' => array(

                    'route'    => '/',

                    'defaults' => array(

                        'controller' => 'Application\Controller\Demo',

                        'action'     => 'index',

                    ),

                ),

            ),

             /*------------------------------------------------*/

                      'fotos' => array(

                'type' => 'Zend\Mvc\Router\Http\Literal',

                'options' => array(

                    'route'    => '/fotos',

                    'defaults' => array(

                        'controller' => 'Application\Controller\Demo',

                        'action'     => 'fotos',

                    ),

                ),

            ),

            /*-------------------------------------------------*/

                       'musica' => array(

                'type' => 'Zend\Mvc\Router\Http\Literal',

                'options' => array(

                    'route'    => '/musica',

                    'defaults' => array(

                        'controller' => 'Application\Controller\Demo',

                        'action'     => 'musica',

                    ),

                ),

            ),

            /*-------------------REPASADO HASTA AQUI-------------------*/

            // The following is a route to simplify getting started creating

            // new controllers and actions without needing to create a new

            // module. Simply drop new controllers in, and you can access them

            // using the path /application/:controller/:action

           

            'application' => array(

                'type'    => 'Literal',

                'options' => array(

                    'route'    => '/application',

                    'defaults' => array(

                        '__NAMESPACE__' => 'Application\Controller',

                        'controller'    => 'Index',

                        'action'        => 'index',

                    ),

                ),

       

                'may_terminate' => true,

                'child_routes' => array(

                    '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(

                            ),

                        ),

                    ),

                ),

            ),

        ),

    ),

    'service_manager' => array(

        'abstract_factories' => array(

            'Zend\Cache\Service\StorageCacheAbstractServiceFactory',

            'Zend\Log\LoggerAbstractServiceFactory',

        ),

        'aliases' => array(

            'translator' => 'MvcTranslator',

        ),

    ),

    'translator' => array(

        'locale' => 'es_ES',

        'translation_file_patterns' => array(

            array(

                'type'     => 'gettext',

                'base_dir' => __DIR__ . '/../language',

                'pattern'  => '%s.mo',

            ),

        ),

    ),

    'controllers' => array(

        'invokables' => array(

            'Application\Controller\Index' => 'Application\Controller\IndexController',

            'Application\Controller\Demo' => 'Application\Controller\DemoController'

        ),

    ),

    'view_manager' => array(

        'display_not_found_reason' => true,

        'display_exceptions'       => true,

        'doctype'                  => 'HTML5',

        'not_found_template'       => 'error/404',

        'exception_template'       => 'error/index',

        'template_map' => array(

            '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' => array(

            __DIR__ . '/../view',

        ),

    ),

    // Placeholder for console routes

    'console' => array(

        'router' => array(

            'routes' => array(

            ),

        ),

    ),

);


Con unas pocas líneas de código hemos eliminado de la url /application/demo/ algo que el usuario agradecerá.

Pero aun falta una cosa, en las vistas apuntabamos directamente http://tutorial-zend.localhost/application/demo/ ahora tendremos que modificar la url de cada uno de los links y ponerlos apuntando a cada una de las url's amigables, así que abrimos index.phtml, fotos.phtml y musica.phtml y  reemplazamos el href por las nuevas rutas amigables ...

http://tutorial-zend.localhost/
http://tutorial-zend.localhost/fotos
http://tutorial-zend.localhost/musica  

En el próximo capítulo continuaremos viendo cosas para configurar el módulo. Saludos.