38 votes

Accès au module de config dans Zend Framework 2

Comment je peux accéder à mon module de config de la manette?

94voto

tomo Points 841

Je suis vraiment surpris de voir à quelle obscure c'est, parce que j'ai eu exactement le même problème et impossible de trouver une réponse définitive. On pourrait penser que le ZF2 documentation voudrais dire quelque chose à ce sujet. De toute façon, à l'aide de l'essai et l'erreur, je suis tombé sur ce très simple réponse:

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

Cette fonction 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 que vous avez besoin.

Même si l'OP est assez vieux maintenant, j'espère que cela sauve quelqu'un de l'heure ou plus, il m'a fallu pour arriver à cette réponse.

7voto

Jason Grimes Points 86

Exactement ce que vous voulez faire dans votre contrôleur avec le module de configuration? Est-ce quelque chose qui ne peut pas se faire par le conteneur d'injection de dépendances injecter un entièrement configuré votre objet dans votre contrôleur à la place?

Par exemple, Rob Allen débuter avec Zend Framework 2 donne cet exemple de l'injection d'un configuré Zend\Db\Tableau instance 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 avez besoin de faire d'initialisation supplémentaires après l'application a été entièrement autogène, vous pouvez joindre une méthode init de l'amorçage de l'événement, dans votre Module de classe. 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!
    }
}

Serait une de ces approches faire l'affaire?

3voto

samsonasik Points 225

pour Beta5, vous pouvez ajouter une fonction comme ceci 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 config :

print_r($this->config); 

3voto

Filipp Qoma Points 71

Pour module de lecture-seule config de votre module doit mettre en œuvre LocatorRegisteredInterface

Avant:

namespace Application;

class Module
{
   // ...
}

Après:

namespace Application;

use Zend\ModuleManager\Feature\LocatorRegisteredInterface;

class Module implements LocatorRegisteredInterface
{
   // ...
}

Que la mise en œuvre dit LocatorRegistrationListener pour enregistrer le module intance dans le service locator comme espace de noms\Module

Ensuite, n'importe où vous pouvez obtenir l'accès à votre module:

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

        // ...
    }
} 

1voto

Jurian Sluiman Points 8871

Il y a une pull request prêt maintenant, qui tire le module de classe (pour les modules/foo/Module.php Foo\Module de la classe) à partir du conteneur d'injection de dépendances. Cela donne plusieurs avantages, mais vous êtes également en mesure de saisir que l'instance du module à un autre moment si vous avez accès à l' Zend\Di\Locator.

Si votre contrôleur d'action s'étend de l' Zend\Mvc\Controller\ActionController, alors que votre contrôleur est LocatorAware. Sens, lors de l'instanciation de votre contrôleur est injecté avec le localisateur de savoir à propos des modules. Ainsi, vous pouvez retirer le module de classe à partir de la DIC dans votre contrôleur. Maintenant, quand votre module consomme un fichier de configuration et le stocke dans le module instance de classe, vous pouvez créer un getter pour accéder à cette configuration des données à partir d'une classe avec un localisateur. Vous avez probablement déjà un accesseur avec votre module Foo\Module::getConfig()

Tout en ZF2 est fortement sous-développement et peut-être que ce code va changer plus tard, cette fonctionnalité est actuellement couvert par ce test, avec cette partie la plus pertinente:

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

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

Donc, avec $sharedInstance votre module de classe, vous pouvez accéder à la config à partir de là. Je m'attends à un raccourci pour cette fonction prochainement, mais cela ne peut être fait après le PR #786 a été fusionné dans ZF2 maître.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X