4

私は現在ZF2serviceManagerで遊んでいますが、serviceManagerがServiceLocatorAwareInterfaceを実装するクラスにsmを挿入しない理由を理解しようとしています。

私の主な質問は、それを正しく行っているのか、それともServiceLocatorAwareInterfaceを実装するサービスではなく、インジェクションを必要としないサービスの「サービス」キーなのかということです。

Module.phpで

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

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;
    }
}

コントローラでサービスを呼び出すとき

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

    }

}
4

2 に答える 2

5

ServiceManagerAwareInterfaceと、サービスへのService Managerの自動注入を利用する場合は、引き続き「invokables」セクションを使用する必要があります。

/Zend/ServiceManager/ServiceManager.phpを見ると、「サービス」は、すでにインスタンス化されているオブジェクトとしてServiceManagerに登録されていることを意味します。サービスロケーターが取得中にサービスのローカルキャッシュを検索するとき、「サービス」はすでに完全にセットアップされていると想定し、smを挿入したり、初期化子を実行したりしません。

「invokables」、「factories」、「abstract_factories」はその場で作成され、「initializers」が新しく作成されたサービスインスタンスで実行されるときにsmを注入します(関数create($ name)を参照)。

于 2013-01-30T16:56:52.247 に答える
3

getServiceConfig()を忘れて、代わりにモジュール構成を使用してください。より高速でキャッシュ可能です。

module.config.php

'service_manager' => array(
    'invokables' => array(
        'MyModule\Service\Service' => 'MyModule\Service\Service',
    ),
)

MyModule \ Service \ Service.php

<?php
namespace MyModule\Service;

use \Zend\ServiceManager\ServiceLocatorInterface;

class Service
{
    public function __invoke(ServiceLocatorInterface $sm)
    {
        // go bananas here :)
    }

    public functiom greet()
    {
        return 'Hello World';
    }
}

zend2内のどこでも

<?php
    $service=$serviceManager->get('MyModule\Service\Service');
    echo $service->greet();
于 2013-10-25T21:59:19.290 に答える