为了让我的对象管理器进入我的字段集的 init() 函数,我遵循了文档 起初我发现我必须改变
public function setServiceLocator(ServiceLocator $sl)
至
public function setServiceLocator(ServiceLocatorInterface $sl)
否则我得到一个错误:
setServiceLocator() must be compatible with that of Zend\ServiceManager\ServiceLocatorAwareInterface::setServiceLocator()
调用时,$this->getServiceLocator()
我得到了 FormManager 的一个实例。另外调用$this->getServiceLocator()->getServiceLocator()
返回NULL
。
由于我还是 DI 的新手,我想知道我是否缺少注射的地方?
测试我从
$form = new MyForm();
至
$formManager = $this->serviceLocator->get('FormElementManager');
$form = $formManager->get('Application\Form\MyForm');
从那以后我得到这个错误:
exception 'Zend\Di\Exception\RuntimeException' with message 'Invalid instantiator of type "NULL" for "Zend\ServiceManager\ServiceLocatorInterface".'
An abstract factory could not create an instance of applicationformmyform(alias: Application\Form\MyForm).
无论如何ServiceLocator
,不建议使用 Awareness 阅读其他一些线程。正在使用FormElementProviderInterface
替代方案吗?
我之前在我的课程中使用过 ServiceLocatorAwareInterface,如下所示:
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class MyClass implements ServiceLocatorAwareInterface
{
protected $services;
public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
{
$this->services = $serviceLocator;
}
public function getServiceLocator()
{
return $this->services;
}
并简单地在我的 c 中为每个服务定位器调用它
$sm = $this->getServiceLocator();
$myClass = $sm->get('Application\Service\MyClass');
无需设置 DI。这对于 Fieldsets / Form 是否必要以及在哪里/如何准确?
我试图以这种方式注入我的表单和字段集:
'service_manager' => array(
'factories' => array(
'Application\Form\CreateCostcenter' => function (\Zend\ServiceManager\ServiceLocatorInterface $sl) {
$form = new \Application\Form\CreateCostcenter();
$form->setServiceLocator($sl);
return $form;
},
'Application\Form\CostcenterFieldset' => function (\Zend\ServiceManager\ServiceLocatorInterface $sl) {
$fieldset = new \Application\Form\CostcenterFieldset();
$fieldset->setServiceLocator($sl);
return $fieldset;
},
),
),
在我的控制器中调用它时,注入适用于我的表单:
$form = $this->getServiceLocator()->get('Application\Form\CreateCostcenter');
但当然它不会将 serviceManager 传递给 Fieldset。
无论如何,我不明白为什么必须为 serviceManagerAwareness 配置一个配置,因为它只需实现它就可以与其他类一起使用。自ZF 2.1起,文档中也没有关于高级用法的提示:
使用初始化程序(如 Zend\ServiceManager\ServiceLocatorAwareInterface)将特定对象注入所有表单/字段集/元素