使用 Zend 插件管理器实现工厂模式
Implement the factory pattern with the Zend Plugin Manager
函数 createInstance(String $instance) : InstanceInterface{}
应该 return IntanceInterface
的实例。我不想使用 switch 语句,因为有太多实例 (different 类) 。尽管一位朋友告诉我 Zend-Framework 3 中的插件管理器。
我阅读了 Service Manager,因为它们似乎是相关的。
服务管理器代替插件管理器得到了很好的记录和描述。
我想我的实现方式有误,因为我得到了 php 错误:
Deprecated: Zend\ServiceManager\AbstractPluginManager::__construct now expects a Interop\Container\ContainerInterface instance representing the parent container; please update your code in /website/admin/vendor/zendframework/zend-servicemanager/src/AbstractPluginManager.php on line 85
Warning: ini_set(): Headers already sent. You cannot change the session module's ini settings at this time in /website/admin/vendor/zendframework/zend-session/src/Config/SessionConfig.php on line 148
实例工厂
protected $instancePluginManager;
public function __construct(InstancePluginManager $instacePluginManager)
{
$this->instancePluginManager = $instancePluginManager;
}
public function createInstance(string $instance) :InstanceInterface
{
$this->instacePluginManager->get($instance);
}
InstancePluginManager
class InstancePluginManager extends AbstractPluginManager
{
protected $instanceOf = InstanceInterface::class;
/**
* @var string[]|callable[] Default factories
*/
protected $factories = [
A::class => InvokableFactory::class,
B::class => InvokableFactory::class,
C::class => InvokableFactory::class,
D::class => InvokableFactory::class,
E::class => InvokableFactory::class,
F::class => InvokableFactory::class,
G::class => InvokableFactory::class,
H::class => InvokableFactory::class,
I::class => InvokableFactory::class,
J::class => InvokableFactory::class,
];
public function validate($instance)
{
if (! $instance instanceof $this->instanceOf) {
throw new InvalidServiceException(sprintf(
'Chart of type "%s" is invalid; must implement %s',
(is_object($instance) ? get_class($instance) : gettype($instance)),
$this->instanceOf
));
}
}
}
InstanceFactoryFactory(Zend 工厂)
class InstanceFactoryFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$instancePluginManager = $container->get(InstancePluginManager::class);
return new InstanceFactory($instancePluginManager);
}
}
module.config.php
return [
'service_manager' => [
'factories' => [
InstanceFactory::class => InstanceFactoryFactory::class,
InstancePluginManager::class => InvokableFactory::class,
],
],
];
改变
InstancePluginManager::class => InvokableFactory::class
至
InstancePluginManager::class => function (ContainerInterface $container, $requestedName) {
return new InstancePluginManager($container);
}
InvokableFactory 正在尝试创建不带参数的 InstancePluginManager。
函数 createInstance(String $instance) : InstanceInterface{}
应该 return IntanceInterface
的实例。我不想使用 switch 语句,因为有太多实例 (different 类) 。尽管一位朋友告诉我 Zend-Framework 3 中的插件管理器。
我阅读了 Service Manager,因为它们似乎是相关的。
服务管理器代替插件管理器得到了很好的记录和描述。
我想我的实现方式有误,因为我得到了 php 错误:
Deprecated: Zend\ServiceManager\AbstractPluginManager::__construct now expects a Interop\Container\ContainerInterface instance representing the parent container; please update your code in /website/admin/vendor/zendframework/zend-servicemanager/src/AbstractPluginManager.php on line 85
Warning: ini_set(): Headers already sent. You cannot change the session module's ini settings at this time in /website/admin/vendor/zendframework/zend-session/src/Config/SessionConfig.php on line 148
实例工厂
protected $instancePluginManager;
public function __construct(InstancePluginManager $instacePluginManager)
{
$this->instancePluginManager = $instancePluginManager;
}
public function createInstance(string $instance) :InstanceInterface
{
$this->instacePluginManager->get($instance);
}
InstancePluginManager
class InstancePluginManager extends AbstractPluginManager
{
protected $instanceOf = InstanceInterface::class;
/**
* @var string[]|callable[] Default factories
*/
protected $factories = [
A::class => InvokableFactory::class,
B::class => InvokableFactory::class,
C::class => InvokableFactory::class,
D::class => InvokableFactory::class,
E::class => InvokableFactory::class,
F::class => InvokableFactory::class,
G::class => InvokableFactory::class,
H::class => InvokableFactory::class,
I::class => InvokableFactory::class,
J::class => InvokableFactory::class,
];
public function validate($instance)
{
if (! $instance instanceof $this->instanceOf) {
throw new InvalidServiceException(sprintf(
'Chart of type "%s" is invalid; must implement %s',
(is_object($instance) ? get_class($instance) : gettype($instance)),
$this->instanceOf
));
}
}
}
InstanceFactoryFactory(Zend 工厂)
class InstanceFactoryFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$instancePluginManager = $container->get(InstancePluginManager::class);
return new InstanceFactory($instancePluginManager);
}
}
module.config.php
return [
'service_manager' => [
'factories' => [
InstanceFactory::class => InstanceFactoryFactory::class,
InstancePluginManager::class => InvokableFactory::class,
],
],
];
改变
InstancePluginManager::class => InvokableFactory::class
至
InstancePluginManager::class => function (ContainerInterface $container, $requestedName) {
return new InstancePluginManager($container);
}
InvokableFactory 正在尝试创建不带参数的 InstancePluginManager。