0

为了让我的对象管理器进入我的字段集的 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)将特定对象注入所有表单/字段集/元素

4

0 回答 0