繁体   English   中英

访问Zend Framework 2中的模块配置

[英]Access to module config in Zend Framework 2

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

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

内部控制器功能:

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

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

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

$eZend\\Mvc\\MvcEvent一个实例


通常,配置可从您有权访问全局服务管理器的任何位置访问,因为配置阵列已注册为名为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将服务定位器中的模块intance保存为namespace \\ Module

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

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

        // ...
    }
} 

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

现在有一个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您的模块类,您可以从那里访问配置。 我希望很快就能获得这个功能的简写,但这只能在PRF 786在ZF2 master中合并之后才能完成。

我创建了带有控制器插件的模块和查看助手,用于读取控制器和视图中的配置。 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;

您还可以通过此hack /技巧随处访问任何配置值

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM