由于zend-mvc的2.7.0 版本已ServiceLocatorAwareInterface
被弃用,因此$this->serviceLocator->get()
控制器内部的调用也是如此。
这就是为什么几天前我对我的所有模块进行了巨大的重构,以通过使用工厂的构造函数注入所需的服务/对象。
当然,我理解为什么这是更好/更清洁的做事方式,因为依赖关系现在更加明显。但另一方面:
这会导致大量开销和更多从未使用过的类实例,不是吗?
让我们看一个例子:
因为我所有的控制器都有依赖关系,所以我为它们创建了工厂。
客户控制器工厂.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);
}
}
客户控制器.php
namespace Admin\Controller;
class CustomerController extends AbstractRestfulController {
public function __construct($customerService, $restSyncService) {
$this->customerService = $customerService;
$this->restSyncService = $restSyncService;
}
}
模块.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 时创建。但是这个同步服务只syncAction()
在 CustomerController内部使用!在我只是$this->serviceLocator->get('Admin\Service\SyncRestClientService')
在内部使用之前syncAction()
,只有它被实例化了。
一般来说,看起来很多实例都是在每次请求时通过工厂创建的,但大多数依赖项都没有使用。这是因为我的设计问题还是“通过构造函数进行依赖注入”的正常副作用行为?