ZendFramework2:是否可以将global.php配置转换为没有serviceLocator的模型?

时间:2016-04-07 16:18:07

标签: php events zend-framework2 service-locator

在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 个答案:

答案 0 :(得分:0)

你应该能够通过像任何其他服务一样的工厂在你的听众中获得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");
}