访问Zend Framework 2中的模块配置


Access to module config in Zend Framework 2

如何从控制器访问模块配置?

我真的很惊讶这件事如此晦涩,因为我遇到了完全相同的问题,却找不到确切的答案。人们可能会认为ZF2文档会对此有所说明。无论如何,通过反复试验,我发现了这个非常简单的答案:

内部控制器功能:

$config = $this->getServiceLocator()->get('Config');

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

$config = $e->getApplication()->getServiceManager()->get('Config');

而CCD_ 2是CCD_ 3 的实例


通常,由于配置阵列注册为名为Config的服务,因此可以从您有权访问全局服务管理器的任何位置访问配置(注意大写C。)

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

尽管OP现在已经很老了,但我希望这能节省我花了一个多小时才得到这个答案的时间。

您到底想在控制器中使用模块配置做什么?是不是让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',
                ),
            ),
        ),
        ...

如果在应用程序完全引导后需要进行额外的初始化,可以在Module类中将init方法附加到引导事件。Matthew Weier 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!
    }
}

这两种方法中的任何一种都能奏效吗?

对于Beta5,您可以在Module.php 中添加这样的函数

public function init(ModuleManager $moduleManager)
{ 
    $sharedEvents = $moduleManager->getEventManager()->getSharedManager();
    $sharedEvents->attach(__NAMESPACE__, 'dispatch', function($e) {
          $config = $e->getApplication()->getConfiguration();
          $controller = $e->getTarget();
          $controller->config = $config;
    });
 }

在控制器中,您可以获得配置:

print_r($this->config); 

要只读取模块配置,您的模块应该只实现LocatorRegisteredInterface

之前:

namespace Application;
class Module
{
   // ...
}

之后:

namespace Application;
use Zend'ModuleManager'Feature'LocatorRegisteredInterface;
class Module implements LocatorRegisteredInterface
{
   // ...
}

该实现要求LocatorRegistrationListener将服务定位器中的模块无形项保存为命名空间''module

然后你可以在任何地方访问你的模块:

class IndexController extends AbstractActionController
{
    public function indexAction()
    {
        /** @var 'Application'Module $module */
        $module = $this->getServiceLocator()->get('Application'Module');
        $moduleOnlyConfig = $module->getConfig();
        // ...
    }
} 

现在有一个pull请求准备好了,它从DI容器中提取模块类(因此是modules/foo/module.php Foo'Module类)。这提供了几个优点,但如果您有权访问Zend'Di'Locator,您也可以在另一次获取该模块实例。

如果你的动作控制器扩展了Zend'Mvc'Controller'ActionController,那么你的控制器就是LocatorAware。这意味着,在实例化时,您的控制器被注入了了解模块的定位器。因此,您可以从控制器中的DIC中提取模块类。现在,当您的模块使用配置文件并将其存储在模块类实例中时,您可以创建一个getter来访问带有定位器的任何类的配置数据。您的模块Foo'Module::getConfig() 可能已经有一个访问器

虽然ZF2正在大量开发中,也许稍后会更改此代码,但此功能目前已包含在本测试中,其中最相关的部分是:

$sharedInstance = $locator->instanceManager()->getSharedInstance('ListenerTestModule'Module');
$this->assertInstanceOf('ListenerTestModule'Module', $sharedInstance);

因此,使用模块类$sharedInstance,您可以从那里访问配置。我预计很快就会有这个功能的简写,但这只能在PR#786在ZF2 master中合并后才能完成。

您需要从模型中实现ServiceLocatorAwareInterface。然后,您可以设置setServiceLocator()和getServiceLocation(),它们使您可以直接访问服务管理器。看看这个代码示例https://gist.github.com/ppeiris/7308289

我创建了带有控制器插件和视图助手的模块,用于读取控制器和视图中的配置。GitHub链接__ Composer链接

通过composer安装

composer require tasmaniski/zf2-config-helper

config/application.config.php文件中注册新模块"ConfigHelper"

'modules' => array(
    '...',
    'ConfigHelper'
),

在控制器中使用它并查看文件

echo $this->configHelp('key_from_config'); // read specific key from config 
$config = $this->configHelp(); // return config object Zend'Config'Config
echo $config->key_from_config;

您也可以通过这个破解/技巧在任何地方访问任何配置值

$configReader = new ConfigReader();
$configData = $configReader->fromFile('./config.ini');
$config = new Config($configData, true);