Accès au module config dans Zend Framework 2
Comment obtenir l'accès à la configuration de mon module à partir du contrôleur?
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.
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?
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);
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();
// ...
}
}
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.
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
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;
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);