有没有办法扩展模块的抽象工厂并删除扩展工厂?我必须对它进行一些修改,但是如果我扩展它并注册我的新工厂,旧工厂仍然是注册的,不是吗?
答案 0 :(得分:4)
您可以使用自己的工厂覆盖工厂,但这会导致代码重复,您必须监控第三方模块的开发人员所做的更新。
您可以使用initializer
但是在每个服务的初始化期间调用它,因此它可能会对性能产生影响。
您正在寻找的是委托人。它是真实(原始)工厂的包装 以下是Marco Pivetta的优秀文章:Delegator Factories in Zend Framework 2 这是他解释委托人的方式:
委托工厂几乎是一个真正的工厂的包装:它 允许我们用“委托”代替真实服务,或者 在返回之前与工厂生成的对象进行交互 Zend \ ServiceManager。
在伪代码中,委托人工厂正在做以下事情:
service = delegatorFactory(factory());
委托人工厂的示例:
class LoggerDelegatorFactory implements DelegatorFactoryInterface
{
public function createDelegatorWithName(
ServiceLocatorInterface $serviceLocator,
$name,
$requestedName,
$callback
) {
$logger = $callback();
$logger->clearFilters();
$logger->addFormatter(new HttpRequestContextFormatter());
return $logger;
}
}
Service Manager配置:
'delegators' => [
'DbLoggingModule\Logger' => [
'LoggerDelegatorFactory',
// can add more of these delegator factories here
],
],