2011-12-31 19 views
7

我有一个关于Zend框架2 questiom:ZF2:依赖注入,MVC,配置和引导

我 库/系统和图书馆/ Zend的。该系统是我的自定义库,我要配置de aplication(路由,模块等,并将用户重定向到正确的模块,控制器和/或操作)。

我不想在每个应用程序/ modules/ModuleName/Module.php文件中执行此操作。所以,我的库/系统可以完成与应用程序配置相关的所有工作。

+0

您是否尝试过直接访问路由器(Zend公司\的mvc \ Application.getRouter())? – Fge 2012-01-01 13:00:11

+0

返回没有通过url info传递的控制器/动作/参数的Zend \ Mvc \ Router \ SimpleRouteStack对象。 – 2012-01-01 16:04:32

+0

@Fge我试过了Zend \ Mvc \ PhpEnvironment \ Request.getRequestUri(),但没有成功。 – 2012-01-01 16:08:31

回答

9

如上评论说:注册到引导事件,并添加新的路线有:

<?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');并返回Zend\Mvc\Application一个实例。看看那里可以看到哪些附加部分。在实际调度发生之前触发bootstrap事件。

请注意,ZendFramework 1路由并不总是与ZendFramework 2兼容。

更新到意见

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

更新到新的问题

<?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 
    } 
} 

这只是发生在一个 ZF2模块(名为Application可以是唯一一个为好) 。这不符合你的需求?你可以:

  • 扩展的自定义module autoloader
  • 延长的Zend \的mvc \申请自己的逻辑
  • 使你的代码ZF2兼容
+0

在这个例子中,我的模块将在“mywebsite.com/test”被请求时被调用? – 2012-01-02 16:31:07

+0

如果在我的'library/custom/application.php'中执行相同的操作,但是在这个模块实例中:'$ events-> attach('bootstrap','bootstrap',array(INSTANCE OF MODULE,'init '),100);',这样,我可以自动调用init方法并定义我的模块路由。 (当然,用更多的代码来做这件事。) – 2012-01-02 16:33:08

+0

一个类型:具有相同名称的'公共函数init(Manager $ moduleManager)'和'公共函数init($ e)'。 – 2012-01-02 16:35:04