события — ZendFramework2: возможно ли получить конфигурацию global.php в модель без serviceLocator?

В 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?

1

Решение

Вы должны быть в состоянии получить 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");
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]