为什么Servicemanager注入了invokable而不是service

Pon*_*juh 4 php zend-framework2

我正在使用ZF2 serviceManager,我正在试图找出为什么serviceManager不会在实现ServiceLocatorAwareInterface的类中注入sm.

我的主要问题是我做得对,还是"服务"键不是用于实现ServiceLocatorAwareInterface的服务,而是用于不需要注入的服务?

在Module.php中

public function getServiceConfig() {
    return array(
        'invokables' => array(
            'myService1' => 'MyModule\Service\Service'
        ),
        'services' => array(
            'myService2' => new MyModule\Service\Service(),
        ),
    );
}
Run Code Online (Sandbox Code Playgroud)

在MyModule\Service\Service.php中

namespace MyModule\Service;

use Zend\ServiceManager\ServiceManagerAwareInterface;
use Zend\ServiceManager\ServiceManager;

class Service implements ServiceManagerAwareInterface
{
    /**
     * @var ServiceManager
     */
    protected $serviceManager = NULL;

    /**
     * Retrieve service manager instance
     *
     * @return ServiceManager
     */
    public function getServiceManager()
    {
        return $this->serviceManager;
    }

    /**
     * Set service manager instance
     *
     * @param ServiceManager $serviceManager
     */
    public function setServiceManager(ServiceManager $serviceManager)
    {
        $this->serviceManager = $serviceManager;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在控制器中调用服务时

<?php

namespace MyModule\Controller;

use Zend\Mvc\Controller\AbstractActionController;

class IndexController extends AbstractActionController
{

    public function IndexAction() {

        $service1   = $this->getServiceLocator()->get('myService1');
        $sm1        = $service1->getServiceManager(); 
        //$sm1 becomes a object of Zend\ServiceManager\ServiceManager
        //In other words i now can access the SM from within my service.

        $service2   = $this->getServiceLocator()->get('myService2');
        $sm2        = $service2->getServiceManager(); 
        //$sm2 becomes NULL
        //The service isn't aware of the SM and can't access it.

    }

}
Run Code Online (Sandbox Code Playgroud)

小智 5

如果您想使用ServiceManagerAwareInterface并自动将Service Manager注入您的服务,则应继续使用"invokables"部分.

通过/Zend/ServiceManager/ServiceManager.php查看,"services"意味着使用ServiceManager注册为已经实例化的对象.当服务定位器在检索期间查找其服务的本地缓存时,它假定"服务"已经完全设置并且不注入sm或运行任何初始化器.

"invokables","工厂","abstract_factories"是动态创建的,并在新创建的服务实例上运行"初始化程序"时注入sm(请参阅函数create($ name)).