如何从控制器访问我的模块配置?
答案 0 :(得分:89)
我真的很惊讶这是多么模糊,因为我有完全相同的问题,无法找到明确的答案。有人会认为ZF2文档会对此有所说明。无论如何,使用反复试验,我遇到了这个非常的简单答案:
$config = $this->getServiceLocator()->get('Config');
Module.php
文件):$config = $e->getApplication()->getServiceManager()->get('Config');
而$e
是Zend\Mvc\MvcEvent
通常,配置可从您有权访问全局服务管理器的任何位置访问,因为配置阵列已注册为名为Config
的服务。 (请注意大写C
。)
这将返回application.config.php(全局和本地)与module.config.php联合的数组。然后,您可以根据需要访问数组元素。
即使OP现在已经很老了,但我希望这可以节省一个小时或更长时间才能得到这个答案。
答案 1 :(得分:7)
您希望在控制器中使用模块配置做什么?是否可以通过让DI容器将完全配置的对象注入控制器而无法实现?
例如,Rob Allen's Getting Started with 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方法附加到引导事件。 blog post by 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!
}
}
这些方法中的任何一种都可以解决这个问题吗?
答案 2 :(得分:3)
对于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);
答案 3 :(得分:3)
要读取仅模块配置,您的模块应该只实现LocatorRegisteredInterface
在:
namespace Application;
class Module
{
// ...
}
后:
namespace Application;
use Zend\ModuleManager\Feature\LocatorRegisteredInterface;
class Module implements LocatorRegisteredInterface
{
// ...
}
该实现说LocatorRegistrationListener将服务定位器中的模块intance保存为 namespace \ Module
然后,您可以在任何地方访问您的模块:
class IndexController extends AbstractActionController
{
public function indexAction()
{
/** @var \Application\Module $module */
$module = $this->getServiceLocator()->get('Application\Module');
$moduleOnlyConfig = $module->getConfig();
// ...
}
}
答案 4 :(得分:1)
有一个pull request ready now从DI容器中提取模块类(所以modules / foo / Module.php Foo\Module
类)。这有几个优点,但如果您有权访问Zend\Di\Locator
,您还可以再次获取该模块实例。
如果您的操作控制器扩展了Zend\Mvc\Controller\ActionController
,那么您的控制器就是LocatorAware。意思是,在实例化时,控制器注入定位器,了解模块。因此,您可以从控制器中的DIC中提取模块类。现在,当您的模块使用配置文件并将其存储在模块类实例中时,您可以创建一个getter来从任何具有定位器的类访问该配置数据。您可能已经拥有模块Foo\Module::getConfig()
虽然ZF2正在大量开发中,而且此代码可能会在以后更改,但此功能目前由this test涵盖,这是最相关的部分:
$sharedInstance = $locator->instanceManager()->getSharedInstance('ListenerTestModule\Module');
$this->assertInstanceOf('ListenerTestModule\Module', $sharedInstance);
因此,使用$sharedInstance
模块类,您可以从那里访问配置。我希望很快就能获得这个功能的简写,但这只能在PRF 786合并到ZF2 master之后才能完成。
答案 5 :(得分:1)
您需要从模型中实现ServiceLocatorAwareInterface。然后,您可以设置setServiceLocator()和getServiceLocator(),以便直接访问服务管理器。请查看此代码示例https://gist.github.com/ppeiris/7308289
答案 6 :(得分:0)
我使用控制器插件和视图助手创建了模块,用于读取控制器和视图中的配置。 GitHub link __ Composer link
通过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;
答案 7 :(得分:0)
您还可以通过此黑客/技巧
随处访问任何配置值$configReader = new ConfigReader();
$configData = $configReader->fromFile('./config.ini');
$config = new Config($configData, true);