Access to module config in Zend Framework 2

前端 未结 8 2106
清酒与你
清酒与你 2021-01-30 21:05

How I can get access to my module config from the controller?

相关标签:
8条回答
  • 2021-01-30 21:33

    You need to implements ServiceLocatorAwareInterface from your model. And then you can set setServiceLocator() and getServiceLocator() which give you direct access to the service manager. Take a look at this code sample https://gist.github.com/ppeiris/7308289

    0 讨论(0)
  • 2021-01-30 21:37

    you can also access any config value anywhere by this hack/tricks

    $configReader = new ConfigReader();
    $configData = $configReader->fromFile('./config.ini');
    $config = new Config($configData, true);
    
    0 讨论(0)
  • 2021-01-30 21:38

    I created the module with controller plugin and view helper for reading a config in controllers and views. GitHub link __ Composer link

    Install it via composer

    composer require tasmaniski/zf2-config-helper
    

    Register new module "ConfigHelper" in your config/application.config.php file

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

    Use it in controller and view files

    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;
    
    0 讨论(0)
  • 2021-01-30 21:41

    for Beta5, you can add function like this in 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;
        });
     }
    

    in controller, you can get config :

    print_r($this->config); 
    
    0 讨论(0)
  • 2021-01-30 21:42

    I am really surprised at how obscure this is, because I had exactly the same problem and could not find a definitive answer. One would think the ZF2 documentation would say something about this. Anyhow, using trial and error, I came across this extremely simple answer:

    Inside controller functions:

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

    Inside Module class functions (the Module.php file):

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

    whereas $e is an instance of Zend\Mvc\MvcEvent


    In general, the config is accessible from anywhere you have access to the global service manager since the config array is registered as a service named Config. (Note the uppercase C.)

    This returns an array of the union of application.config.php (global and local) and your module.config.php. You can then access the array elements as you need to.

    Even though the OP is quite old now, I hope this saves someone the hour or more it took me to get to this answer.

    0 讨论(0)
  • 2021-01-30 21:43

    What exactly do you want to do in your controller with the module configuration? Is it something that can't be done by having the DI container inject a fully configured object into your controller instead?

    For example, Rob Allen's Getting Started with Zend Framework 2 gives this example of injecting a configured Zend\Db\Table instance into a controller:

    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',
                    ),
                ),
            ),
            ...
    

    If you need to do additional initialization after the application has been fully bootstrapped, you could attach an init method to the bootstrap event, in your Module class. A blog post by Matthew Weier O'Phinney gives this example:

    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!
        }
    }
    

    Would either of these approaches do the trick?

    0 讨论(0)
提交回复
热议问题