web-dev-qa-db-fra.com

Accès à la configuration de module dans Zend Framework 2

Comment puis-je accéder à la configuration de mon module à partir du contrôleur?

35
Dmitry

Je suis vraiment surpris de voir à quel point c'est obscur, car j'avais exactement le même problème et je ne pouvais pas trouver de réponse définitive. On pourrait penser que la documentation de ZF2 en dirait quelque chose. Quoi qu'il en soit, après essais et erreurs, je suis tombé sur cette extrêmement réponse simple:

Fonctions du contrôleur interne:

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

Fonctions de classe Inside Module (le fichier Module.php):

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

alors que $e est une instance de Zend\Mvc\MvcEvent


En général, la configuration est accessible depuis n’importe quel endroit où vous avez accès au gestionnaire de services global car le tableau de configuration est enregistré en tant que service nommé Config. (Notez la majuscule C.)} _

Cela retourne un tableau de l'union de application.config.php (global et local) et de votre module.config.php. Vous pouvez ensuite accéder aux éléments du tableau selon vos besoins.

Même si le PO est assez ancien, j'espère que cela épargnera à quelqu'un l'heure ou plus qu'il m'a fallu pour en arriver à cette réponse.

89
tomo

Que voulez-vous faire exactement dans votre contrôleur avec la configuration du module? Est-ce quelque chose qui ne peut pas être fait en laissant le conteneur DI injecter un objet entièrement configuré dans votre contrôleur?

Par exemple, Initiation à Zend Framework 2 de Rob Allen } donne cet exemple d'injection d'une instance Zend\Db\Table configurée dans un contrôleur:

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

Si vous devez effectuer une initialisation supplémentaire après le démarrage complet de l'application, vous pouvez associer une méthode init à l'événement bootstrap, dans votre classe Module. Un post de blog de Matthew Weier O'Phinney } donne cet exemple:

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

Est-ce que l'une ou l'autre de ces approches ferait l'affaire?

7
Jason Grimes

pour Beta5, vous pouvez ajouter une fonction comme celle-ci dans 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;
    });
 }

dans le contrôleur, vous pouvez obtenir la configuration:

print_r($this->config); 
3
samsonasik

Pour lire la configuration de module uniquement, votre module doit simplement implémenter LocatorRegisteredInterface.

Avant:

namespace Application;

class Module
{
   // ...
}

Après:

namespace Application;

use Zend\ModuleManager\Feature\LocatorRegisteredInterface;

class Module implements LocatorRegisteredInterface
{
   // ...
}

Cette implémentation indique à LocatorRegistrationListener de sauver le module intance de service locator en tant que namespace \ Module

Alors n'importe où vous pouvez avoir accès à votre module:

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

        // ...
    }
} 
3
Filipp Qoma

Il y a une demande pull prête maintenant qui extrait la classe de module (donc la classe modules/foo/Module.php Foo\Module) du conteneur DI. Cela présente plusieurs avantages, mais vous pouvez également récupérer cette instance de module une autre fois si vous avez accès au Zend\Di\Locator.

Si votre contrôleur d'action étend le Zend\Mvc\Controller\ActionController, votre contrôleur est LocatorAware. Cela signifie que lors de l’instanciation, votre contrôleur reçoit une injection du localisateur connaissant les modules. Vous pouvez donc extraire la classe de module du DIC de votre contrôleur. Désormais, lorsque votre module utilise un fichier de configuration et le stocke dans l'instance de classe du module, vous pouvez créer un accesseur pour accéder aux données de configuration à partir de n'importe quelle classe dotée d'un localisateur. Vous avez probablement déjà un accesseur avec votre module Foo\Module::getConfig()

Alors que ZF2 est en plein développement et que ce code changera peut-être plus tard, cette fonctionnalité est actuellement couverte par this test , cette partie étant la plus pertinente:

$sharedInstance = $locator->instanceManager()->getSharedInstance('ListenerTestModule\Module');

$this->assertInstanceOf('ListenerTestModule\Module', $sharedInstance);

Donc, avec $sharedInstance votre classe de module, vous pouvez accéder à la configuration à partir de là. J'attends bientôt un raccourci pour cette fonctionnalité, mais cela ne peut être fait qu'après la fusion du PR # 786 dans le maître ZF2.

1
Jurian Sluiman

Vous devez implémenter ServiceLocatorAwareInterface à partir de votre modèle. Et vous pouvez ensuite définir setServiceLocator () et getServiceLocator () qui vous donnent un accès direct au gestionnaire de service. Jetez un coup d’œil à cet exemple de code https://Gist.github.com/ppeiris/7308289

1
ppeiris

vous pouvez également accéder à n'importe quelle valeur de configuration n'importe où par ce hack

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