zend-mvcのバージョン2.7.0以降、ServiceLocatorAwareInterface
は無効になりますので、コントローラ内で$this->serviceLocator->get()
も呼び出されます。ZF2でserviceLocator-> get()の依存性注入の新しい方法は非効率的ですか?
何日か前、私はすべてのモジュールを大量にリファクタリングして、必要なサービス/オブジェクトをコンストラクタを通して大部分のすべての工場で使用するようにしました。
確かに、依存関係が今よりはっきりとわかるので、これがより良い/よりクリーンな方法です。しかし、反対側:
これは、重いオーバーヘッドとはるかに使用されないクラスのインスタンスにつながるでしょうか?
のは一例に見てみましょう:
をすべての私のコントローラが依存関係を持っているので、私はそれらのすべてのための工場を作成しました。
CustomerControllerFactory.php
namespace Admin\Factory\Controller;
class CustomerControllerFactory implements FactoryInterface {
public function createService(ServiceLocatorInterface $controllerManager) {
$serviceLocator = $controllerManager->getServiceLocator();
$customerService = $serviceLocator->get('Admin\Service\CustomerService');
$restSyncService = $serviceLocator->get('Admin\Service\SyncRestClientService');
return new \Admin\Controller\CustomerController($customerService, $restSyncService);
}
}
CustomerController.php
namespace Admin\Controller;
class CustomerController extends AbstractRestfulController {
public function __construct($customerService, $restSyncService) {
$this->customerService = $customerService;
$this->restSyncService = $restSyncService;
}
}
module.config.php
'controllers' => [
'factories' => [
'Admin\Controller\CustomerController' => 'Admin\Factory\Controller\CustomerControllerFactory',
]
],
'service_manager' => [
'factories' => [
'Admin\Service\SyncRestClientService' => 'Admin\Factory\SyncRestClientServiceFactory',
]
]
SyncRestClientServiceFactory.php
namespace Admin\Factory;
class SyncRestClientServiceFactory implements FactoryInterface {
public function createService(ServiceLocatorInterface $serviceLocator) {
$entityManager = $serviceLocator->get('doctrine.entitymanager.orm_default');
$x1 = $serviceLocator->get(...);
$x2 = $serviceLocator->get(...);
$x3 = $serviceLocator->get(...);
// ...
return new \Admin\Service\SyncRestClientService($entityManager, $x1, $x2, $x3, ...);
}
}
SyncRestServiceは、我々のシステムのいくつかの内部サーバーに照会し、複雑なサービスクラスです。これは多くの依存関係を持ち、要求がCustomerControllerに来ると常に生成されます。しかし、この同期サービスはのみがCustomerControllerのsyncAction()
の内部で使用されています!私が単に$this->serviceLocator->get('Admin\Service\SyncRestClientService')
をsyncAction()
の内部に使用する前は、インスタンス化されました。
一般に、すべての要求で工場から多数のインスタンスが作成されるようですが、ほとんどの依存関係は使用されません。これは私の設計上の問題なのでしょうか、あるいは「コンストラクタを介して依存性注入を行う」という通常の副作用の動作ですか?
私はここでほぼ同じ質問をしました:http://stackoverflow.com/questions/33496279/servicelocator-lets-thoughts-about-it-in-zf2-context – Hooli