Comment je peux accéder à mon module de config de la manette?
Réponses
Trop de publicités?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.
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?
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);
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();
// ...
}
}
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.