2011-12-31 8 views
7

Tengo una questiom en relación con el Zend Framework 2:ZF2: Inyección de dependencia, MVC, configuraciones y Bootstrap

tengo biblioteca/Sistema y una biblioteca/Zend. el sistema es mi biblioteca personalizada, que quiero configurar de aplicación (rutas, módulos, etc., y redirigir al usuario al módulo, controlador y/o acción correctos).

No quiero hacer esto dentro de cada aplicación/módulos/ModuleName/Module.php. Entonces, mi biblioteca/Sistema puede hacer todo lo relacionado con la configuración de la aplicación.

+0

Ha intentado acceder al router directamente (Zend \ Mvc \ Application.getRouter())? – Fge

+0

Devuelve un objeto Zend \ Mvc \ Router \ SimpleRouteStack sin el controlador/acción/params pasado por la información de url. –

+0

@Fge He intentado Zend \ Mvc \ PhpEnvironment \ Request.getRequestUri(), pero sin éxito. –

Respuesta

9

Como se ha dicho en los comentarios anteriores: Regístrese para el sistema de arranque-evento y añadir nuevas rutas ahí:

<?php 

namespace Application; 

use Zend\Module\Manager, 
    Zend\EventManager\StaticEventManager; 

class Module 
{ 
    public function init(Manager $moduleManager) 
    { 
     $events = StaticEventManager::getInstance(); 
     $events->attach('bootstrap', 'bootstrap', array($this, 'initCustom'), 100); 
    } 

    public function initCustom($e) 
    { 
     $app = $e->getParam('application'); 
     $r = \Zend\Mvc\Router\Http\Segment::factory(array(
       'route' => '/test', 
       'defaults' => array(
        'controller' => 'test' 
       ) 
      ) 
     ); 
     $app->getRouter()->addRoute('test',$r); 
    } 
} 

$app = $e->getParam('application'); qué devolver una instancia de Zend\Mvc\Application. Eche un vistazo allí para ver qué partes adicionales puede obtener allí. El evento bootstrap se activa antes de que se produzca el envío real.

Tenga en cuenta que las rutas de ZendFramework 1 no siempre son compatibles con las de ZendFramework 2.

actualización a los comentarios

public function initCustom($e) 
{ 
    $app = $e->getParam('application'); 
    // Init a new router object and add your own routes only 
    $app->setRouter($newRouter); 
} 

actualización a nueva pregunta

<?php 

namespace Application; 

use Zend\Module\Manager, 
    Zend\EventManager\StaticEventManager; 

class Module 
{ 
    public function init(Manager $moduleManager) 
    { 
     $events = StaticEventManager::getInstance(); 
     $events->attach('bootstrap', 'bootstrap', array($this, 'initCustom'), 100); 
    } 

    public function initCustom($e) 
    { 
     $zendApplication = $e->getParam('application'); 
     $customApplication = new System\Application(); 
     $customApplication->initRoutes($zendApplication->getRouter()); 
     // ... other init stuff of your custom application 
    } 
} 

Esto sólo ocurre en uno ZF2 módulo (llamado Application que puede ser el único que también) . Esto no se ajusta a tus necesidades? Usted podría:

  • extienden una costumbre module autoloader
  • extender Zend \ MVC \ Application para su propia lógica
  • compatibilizar ZF2-su código
+0

En este ejemplo, ¿se llamará a mi módulo cuando se solicite "mywebsite.com/test"? –

+0

Y si, dentro de mi 'library/custom/application.php' hago lo mismo, pero aquí atach la instancia del Módulo:' $ events-> attach ('bootstrap', 'bootstrap', array (INSTANCE OF MODULE, 'init '), 100); ', de esta manera, puedo llamar automáticamente al método init y definir mi ruta de módulo. (Por supuesto, haz esto con un poco más de código.) –

+0

Un error tipográfico: 'public function init (Manager $ moduleManager)' y 'public function init ($ e)' con los mismos nombres. –

Cuestiones relacionadas