tom*_*omo 93

我真的很惊讶这是多么模糊,因为我有完全相同的问题,无法找到明确的答案.有人会认为ZF2文档会对此有所说明.无论如何,使用反复试验,我遇到了这个非常简单的答案:

内部控制器功能:

$config = $this->getServiceLocator()->get('Config');
Run Code Online (Sandbox Code Playgroud)

内部Module类函数(Module.php文件):

$config = $e->getApplication()->getServiceManager()->get('Config');
Run Code Online (Sandbox Code Playgroud)

而是$e一个例子Zend\Mvc\MvcEvent


通常,配置可从您有权访问全局服务管理器的任何位置访问,因为配置数组已注册为名为的服务Config.(注意大写C.)

这将返回application.config.php(全局和本地)和module.config.php的联合数组.然后,您可以根据需要访问数组元素.

虽然OP现在已经很老了,但我希望这可以节省一些时间来帮助我找到这个答案.

  • 你从哪里($ this)调用这行代码? (2认同)

小智 7

使用模块配置,您希望在控制器中做什么?是否可以通过让DI容器将完全配置的对象注入控制器而无法实现?

例如,Rob Allen的Zend Framework 2入门提供了将配置的Zend\Db\Table实例注入控制器的示例:

return array(
'di' => array(
    'instance' => array(
        'alias' => array(
            'album' => 'Album\Controller\AlbumController',
        ),
        'Album\Controller\AlbumController' => array(
            'parameters' => array(
                'albumTable' => 'Album\Model\AlbumTable',
            ),
        ),
        'Album\Model\AlbumTable' => array(
            'parameters' => array(
                'config' => 'Zend\Db\Adapter\Mysqli',
        )),
        'Zend\Db\Adapter\Mysqli' => array(
            'parameters' => array(
                'config' => array(
                    'host' => 'localhost',
                    'username' => 'rob',
                    'password' => '123456',
                    'dbname' => 'zf2tutorial',
                ),
            ),
        ),
        ...
Run Code Online (Sandbox Code Playgroud)

如果在应用程序完全引导后需要进行其他初始化,则可以在Module类中将init方法附加到引导事件.一个博客文章由马修·威尔O'Phinney给出了这样的例子:

use Zend\EventManager\StaticEventManager,
Zend\Module\Manager as ModuleManager

class Module
{
    public function init(ModuleManager $manager)
    {
        $events = StaticEventManager::getInstance();
        $events->attach('bootstrap', 'bootstrap', array($this, 'doMoarInit'));
    }

    public function doMoarInit($e)
    {
        $application = $e->getParam('application');
        $modules     = $e->getParam('modules');

        $locator = $application->getLocator();
        $router  = $application->getRouter();
        $config  = $modules->getMergedConfig();

        // do something with the above!
    }
}
Run Code Online (Sandbox Code Playgroud)

这些方法中的任何一种都能解决问题吗?