在 Zend 3 中,我无法弄清楚注入应该如何工作,让我举一些简单的例子。
比方说,我有
class ToolCollector implements ToolCollectorInterface {
public function __construct(){}
public function registerTool(ToolInterface $tool){
$this->tools[] = $tool;
}
}
并且
class ToolA implements ToolInterface {
public function __construct(ToolCollectorInterface $mainCollector){$mainCollector->registerTool($this);}
}
所以我期望拥有的
class SomeController extends AbstractActionController {
public function __construct(ToolCollectorInterface $toolCollector){$this->collector=$toolCollector;}
public function indexAction(){
new ToolA; // <- just call Tool and it will put itself in ToolCollector, this is I want
new ToolB; // <- just call Tool and it will put itself in ToolCollector, this is I want
new ToolC; // <- just call Tool and it will put itself in ToolCollector, this is I want
return ViewModel(['toolNameList'=>$this->collector->getRegisteredToolNames();])
}
}
我试图让它如示例所示,当我调用new ToolA
它时,它显示错误 500,没有任何描述。
// Next is works
class ToolControllerFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$pm = $container->get(ToolCollector::class);
return new $requestedName($pm);
}
}
// Next is not reachable, And I do not know why...
class ToolFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$pm = $container->get(ToolCollector::class);
return new $requestedName($pm);
}
}
在 module.config.php
return [
...
'service_manager' => [
'aliases' => [
ToolCollectorInterface::class => ToolCollector::class,
],
'factories' => [
Service\ToolCollector::class => InvokableFactory::class,
],
],
'controllers' => [
'factories' => [
Controller\App\SomeController ::class => ToolControllerFactory::class,
]
],
...
];
有可能做到吗?如何编写工厂使其成为可能?