В config / autoload / global.php у меня есть только конфиг для моей базы данных.
В моей модели у меня есть:
public function __construct($adapter = null)
{
if ($adapter) {
$this->adapter = $adapter;
} else {
... //here I need to get the config without serviceLocator
}
}
public function attach(EventManagerInterface $events)
{
$sharedEvents = $events->getSharedManager();
$this->listeners[] = $sharedEvents->attach("*", "redirect", array($this, "onRedirect"));
}
public function detach(EventManagerInterface $events)
{
foreach ($this->listeners as $index => $listener)
{
if ($events->detach($listener))
{
unset($this->listeners[$index]);
}
}
}
public function onRedirect(EventInterface $e)
{
...
}
Причина проста. Я пытаюсь добавить что-то в базу данных, когда происходит событие, и я не могу получить serviceLocator на слушателе. Я не знаю почему.
Итак … возможно ли получить файл конфигурации без serviceLocator?
Вы должны быть в состоянии получить ServiceLocator
внутри вашего слушателя через фабрику, как в любом другом сервисе:
<?php
namespace Application\Listener\Factory;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Application\Listener\SomeListener;
/**
* Factory for creating the listener
*/
class SomeListenerFactory implements FactoryInterface
{
/**
* Create SomeListener
*
* @param ServiceLocatorInterface $serviceLocator
* @return SomeListener
*/
public function createService(ServiceLocatorInterface $serviceLocator)
{
$config = $serviceLocator->get('config');
$adapter = // create adapter using config and use it to create your listener
return new SomeListener($adapter);
}
}
Зарегистрируйте свою фабрику слушателей внутри своего module.config.php
:
'service_manager' => array(
'factories' => array(
'Application\Listener\SomeListener' => 'Application\Listener\Factory\SomeListenerFactory',
)
)
Теперь вы можете получить ваш слушатель от менеджера службы в любом месте:
$someListener = $serviceManager->get('Application\Listener\SomeListener');
Если вам действительно нужна конфигурация внутри вашего класса (я не вижу причин, по которым это необходимо, и это противоречит принципам ZF2), вы можете включить свой файл конфигурации:
Ваш global.config.php
файл
<?php
return array(
'key' => 'value'
);
Вы можете просто получить содержимое, используя php include:
function fetchConfig()
{
include("path/to/global.config.php");
}
Других решений пока нет …