php - tutorial - zend framework model
Acceso a la configuración del módulo en Zend Framework 2 (8)
¿Qué es exactamente lo que quiere hacer en su controlador con la configuración del módulo? ¿Es algo que no se puede hacer si el contenedor DI inyecta un objeto completamente configurado en su controlador?
Por ejemplo, Getting Started with Zend Framework 2 de Rob Allen brinda este ejemplo de cómo inyectar una instancia Zend / Db / Table configurada en un controlador:
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 necesita realizar una inicialización adicional después de que la aplicación se haya iniciado completamente, puede adjuntar un método init al evento bootstrap, en su clase de Módulo. Una publicación de blog de Matthew Weier O''Phinney da este ejemplo:
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!
}
}
¿Alguno de estos enfoques haría el truco?
¿Cómo puedo acceder a mi configuración de módulo desde el controlador?
Ahora hay una solicitud de extracción preparada que extrae la clase del módulo (por lo que los módulos / foo / Module.php clase Foo/Module
) del contenedor DI. Esto ofrece varias ventajas, pero también puede tomar esa instancia de módulo en otro momento si tiene acceso al Zend/Di/Locator
.
Si su controlador de acción extiende Zend/Mvc/Controller/ActionController
, entonces su controlador es LocatorAware. Es decir, al crear instancia, su controlador se inyecta con el localizador conociendo los módulos. Entonces, puede extraer la clase de módulo del DIC en su controlador. Ahora, cuando su módulo consume un archivo de configuración y lo almacena dentro de la instancia de la clase de módulo, puede crear un getter para acceder a esa información de configuración desde cualquier clase con un localizador. Probablemente ya tenga un programa de acceso con su módulo Foo/Module::getConfig()
Si bien ZF2 está muy en desarrollo y quizás este código cambie más adelante, esta característica está actualmente cubierta por esta prueba , con esta la parte más relevante:
$sharedInstance = $locator->instanceManager()->getSharedInstance(''ListenerTestModule/Module'');
$this->assertInstanceOf(''ListenerTestModule/Module'', $sharedInstance);
Entonces, con $sharedInstance
su clase de módulo, puede acceder a la configuración desde allí. Espero una breve descripción de esta característica pronto, pero esto solo se puede hacer después de que se haya fusionado PR # 786 en el maestro ZF2.
Creé el módulo con plugin de controlador y veo helper para leer una configuración en controladores y vistas. Enlace de GitHub __ Enlace de Compositor
Instalarlo a través del compositor
composer require tasmaniski/zf2-config-helper
Registre el nuevo módulo " ConfigHelper " en su archivo config / application.config.php
''modules'' => array(
''...'',
''ConfigHelper''
),
Úselo en el controlador y vea los archivos
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;
Estoy realmente sorprendido de cuán oscuro es esto, porque tenía exactamente el mismo problema y no podía encontrar una respuesta definitiva. Uno pensaría que la documentación de ZF2 diría algo sobre esto. De todos modos, usando prueba y error, encontré esta respuesta extremadamente simple:
Funciones internas del controlador:
$config = $this->getServiceLocator()->get(''Config'');
Dentro de las funciones de clase del módulo (el archivo Module.php
):
$config = $e->getApplication()->getServiceManager()->get(''Config'');
mientras que $e
es una instancia de Zend/Mvc/MvcEvent
En general, se puede acceder a la configuración desde cualquier lugar donde tenga acceso al administrador de servicio global, ya que la matriz de configuración está registrada como un servicio llamado Config
. (Tenga en cuenta la C
mayúscula).
Esto devuelve una matriz de la unión de application.config.php (global y local) y su module.config.php. Luego puede acceder a los elementos de la matriz cuando lo necesite.
Aunque el OP es bastante viejo ahora, espero que esto le ahorre a alguien la hora o más que tardó en llegar a esta respuesta.
Necesita implementar ServiceLocatorAwareInterface desde su modelo. Y luego puede establecer setServiceLocator () y getServiceLocator () que le dan acceso directo al administrador de servicios. Eche un vistazo a este ejemplo de código https://gist.github.com/ppeiris/7308289
Para leer la configuración de solo módulo, tu módulo debería implementar LocatorRegisteredInterface
Antes de:
namespace Application;
class Module
{
// ...
}
Después:
namespace Application;
use Zend/ModuleManager/Feature/LocatorRegisteredInterface;
class Module implements LocatorRegisteredInterface
{
// ...
}
Esa implementación dice LocatorRegistrationListener para guardar la integridad del módulo en el localizador de servicios como espacio de nombres / Módulo
Luego, en cualquier lugar, puede obtener acceso a su módulo:
class IndexController extends AbstractActionController
{
public function indexAction()
{
/** @var /Application/Module $module */
$module = $this->getServiceLocator()->get(''Application/Module'');
$moduleOnlyConfig = $module->getConfig();
// ...
}
}
para Beta5, puede agregar funciones como esta en 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;
});
}
en el controlador, puede obtener config:
print_r($this->config);
también puede acceder a cualquier valor de configuración en cualquier lugar mediante este truco / trucos
$configReader = new ConfigReader();
$configData = $configReader->fromFile(''./config.ini'');
$config = new Config($configData, true);