Comment puis-je accéder à la configuration de mon module à partir du contrôleur?
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:
$config = $this->getServiceLocator()->get('Config');
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.
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?
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);
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();
// ...
}
}
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.
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
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);