ZF2:如何在Module类中的事件上附加监听器?

时间:2012-12-20 19:01:33

标签: zend-framework2 zend-framework-mvc zend-framework-modules zend-framework-routing

对于给定的请求,我想为我的Mvc的每个组件设置basePath。我的意思是当我调用这些方法时,我想得到相同的结果,让我们说'/spam/ham/'

echo $this->headLink()->prependStylesheet($this->basePath() . '/styles.css')  // $this->basePath() has to be '/spam/ham/'

$this->getServiceLocator()
     ->get('viewhelpermanager')
     ->get('headLink')
     ->rependStylesheet($this->getRequest()->getBasePath() . '/styles.css')   // $this->setRequest()->getBasePath() has to be /spam/ham/

如何为我已找到的第一个案例here's my question设置basePath。顺便说一下,原始手册中没有我从答案中收到的任何信息。

现在是第二个 - basePath必须设置Request

$this->getRequest()->getBasePath()

在这里,我找到了一些实际上根本不起作用的答案http://zend-framework-community.634137.n4.nabble.com/Setting-the-base-url-in-ZF2-MVC-td3946284.html。如上所述here StaticEventManager已弃用,因此我使用SharedEventManager进行了更改:

// In my Application\Module.php

namespace Application;
use Zend\EventManager\SharedEventManager

    class Module {
        public function init() {             

                $events = new SharedEventManager(); 
                $events->attach('bootstrap', 'bootstrap', array($this, 'registerBasePath')); 
            } 

            public function registerBasePath($e) { 

                $modules = $e->getParam('modules'); 
                $config  = $modules->getMergedConfig(); 
                $app     = $e->getParam('application'); 
                $request = $app->getRequest(); 
                $request->setBasePath($config->base_path); 
            } 
        } 
    }

modules/Application/configs/module.config.php我添加:

'base_path' => '/spam/ham/' 

但它不起作用。问题是:

1)运行永远不会进入registerBasePath功能。但它必须。我在init函数中附加了一个监听器的事件。

2)当我为SharedEventManager更改EventManager时,碰巧会转到registerBasePath函数,但会抛出一个异常:

Fatal error: Call to undefined method Zend\EventManager\EventManager::getParam()

我做错了什么?为什么程序的运行没有进入registerBasePath函数?如果这是全局设置basePath的唯一方法,那么该怎么做呢?

1 个答案:

答案 0 :(得分:4)

我知道文档缺少这些东西。但你正确的方法是:

  1. 早点(所以在bootstrap)
  2. 从应用程序中获取请求
  3. 在请求中设置基本路径
  4. 文档缺少此信息,您引用的帖子已经过时了。最快速,最简单的方法是使用onBootstrap()方法:

    namespace MyModule;
    
    class Module
    {
        public function onBootstrap($e)
        {
            $app = $e->getApplication();
            $app->getRequest()->setBasePath('/foo/bar');
        }
    }
    

    如果您想从配置中获取基本路径,可以在那里加载服务管理器:

    namespace MyModule;
    
    class Module
    {
        public function onBootstrap($e)
        {
            $app = $e->getApplication();
            $sm  = $app->getServiceManager();
    
            $config = $sm->get('config');
            $path   = $config->base_path;
    
            $app->getRequest()->setBasePath($path);
        }
    }