Accès au module config dans Zend Framework 2

Comment obtenir l'accès à la configuration de mon module à partir du contrôleur?

34
demandé sur akond 2012-01-22 02:27:40

8 réponses

je suis vraiment surpris à quel point c'est obscur, parce que j'avais exactement le même problème et que je n'ai pas pu trouver de réponse définitive. On pourrait penser que la documentation de ZF2 dirait quelque chose à ce sujet. Quoi qu'il en soit, en utilisant l'essai et l'erreur, je suis tombé sur cela extrêmement réponse simple:

fonctions du contrôleur intérieur:

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

fonctions de classe du Module intérieur (lesModule.php fichier):

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

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


en général, la configuration est accessible de n'importe où vous avez accès au Global service manager puisque le tableau de configuration est enregistré comme un service nommé Config. (Notez le majuscule C.)

renvoie un tableau de l'union d'application.config.php (global et local) et votre module.config.php. Vous pouvez alors accéder aux éléments du tableau comme vous en avez besoin.

même si L'opération est assez ancienne maintenant, j'espère cela permet d'épargner à quelqu'un l'heure ou plus qu'il m'a fallu pour obtenir cette réponse.

87
répondu tomo 2016-11-08 16:03:44

que voulez-vous faire exactement dans votre controller avec la configuration du module? Est-ce quelque chose qui ne peut pas être fait en demandant au conteneur DI d'injecter un objet entièrement configuré dans votre contrôleur à la place?

Par exemple, Rob Allen commence avec Zend Framework 2 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 avez besoin de faire une initialisation supplémentaire après que l'application a vous pouvez attacher une méthode init à l'événement bootstrap, dans votre classe de modules. 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 l'une de ces approches ne le truc?

7
répondu Jason Grimes 2012-01-23 04:50:21

pour Beta5, vous pouvez ajouter une fonction comme celle-ci dans le 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 controller, vous pouvez obtenir la config:

print_r($this->config); 
3
répondu samsonasik 2012-07-10 18:34:52

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 l'implémentation indique LocatorRegistrationListener pour enregistrer l'entrée du module dans le Localisateur de service comme namespace\Module

alors n'importe où vous pouvez accéder à votre module:

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

        // ...
    }
} 
3
répondu Filipp Qoma 2014-02-27 10:13:14

il y a un tirez la demande de prêt maintenant qui tire la classe module (donc les modules/foo/Module.php Foo\Module classe) du container DI. Cela donne plusieurs avantages, mais vous pouvez également saisir cette instance du module une autre fois si vous avez accès à la Zend\Di\Locator.

si votre contrôleur d'action étend le Zend\Mvc\Controller\ActionController, alors votre contrôleur est LocatorAware. Ce qui signifie qu'après instanciation, votre contrôleur est injecté avec le Localisateur connaissant les modules. Donc, vous peut tirer la classe de module de la DIC dans votre controller. Maintenant, lorsque votre module consomme un fichier de configuration et le stocke dans l'instance de classe module, vous pouvez créer un getter pour accéder aux données de configuration de n'importe quelle classe avec un localisateur. Vous avez probablement déjà un accessor avec votre module Foo\Module::getConfig()

alors que ZF2 est fortement en cours de développement et peut-être que ce code changera plus tard, cette fonctionnalité est actuellement couverte par ce test, avec ceci le plus pertinent partie:

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

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

$sharedInstance votre classe de module, vous pouvez accéder à la configuration à partir de là. Je m'attends à un raccourci pour cette fonctionnalité bientôt, mais cela ne pourra être fait qu'après que le PR #786 aura été fusionné dans ZF2 master.

1
répondu Jurian Sluiman 2012-03-05 08:05:41

vous devez implémenter ServiceLocatorAwareInterface à partir de votre modèle. Puis vous pouvez définir setServiceLocator() et getServiceLocator () qui vous donnent un accès direct au gestionnaire de service. Jetez un coup d'oeil à cet exemple de code https://gist.github.com/ppeiris/7308289

1
répondu ppeiris 2013-11-04 19:57:41

j'ai créé le module avec le plugin controller et l'Assistant view pour lire une configuration dans les controllers et les views. GitHub link __ Compositeur lien

l'Installer via composer

composer require tasmaniski/zf2-config-helper

Enregistrer le nouveau module " ConfigHelper" dans votre config / application.config.php le fichier

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

utilisez-le dans le contrôleur et les fichiers de vue

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
répondu tasmaniski 2015-10-05 17:01:55

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

$configReader = new ConfigReader();
$configData = $configReader->fromFile('./config.ini');
$config = new Config($configData, true);
0
répondu Saurabh Chandra Patel 2015-12-22 06:59:57