Zend framework2 Zend Framework 2使用ServiceManager的自定义元素无效

Zend framework2 Zend Framework 2使用ServiceManager的自定义元素无效,zend-framework2,zend-form,zend-form-element,servicemanager,Zend Framework2,Zend Form,Zend Form Element,Servicemanager,我想创建一个自定义元素,并使用用于ZF2 V.2.1的新ServiceManager技术将该元素添加到表单中+ 我试图一步一步地复制相同的示例,但它不起作用 当我使用服务写入短名称时,它会引发异常,因为找不到服务: Zend\ServiceManager\Exception\ServiceNotFoundException File: Zend\ServiceManager\ServiceManager.php:456 Message: Zend\Serv

我想创建一个自定义元素,并使用用于ZF2 V.2.1的新ServiceManager技术将该元素添加到表单中+

我试图一步一步地复制相同的示例,但它不起作用

当我使用服务写入短名称时,它会引发异常,因为找不到服务:

    Zend\ServiceManager\Exception\ServiceNotFoundException
    File:
    Zend\ServiceManager\ServiceManager.php:456
    Message:
    Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for Test
我想我所有的类都是相同的,见下文

这是我的自定义元素:

    namespace SecureDraw\Form\Element;
    use Zend\Form\Element\Text;
    class ProvaElement extends Text {
    protected $hola;
        public function hola(){
            return 'hola';
        }
    }
这是我的Module.php,我的可调用服务可以使用短名称:

    class Module implements FormElementProviderInterface {
        //Rest of class
        public function getFormElementConfig() {
            return array(
                'invokables' => array(
                    'Test' => 'SecureDraw\Form\Element\ProvaElement'
                )               
            );
        } 
    }
在我用于添加元素的表单中,注释行可以正常工作,但短名称不起作用:

    $this->add(array(
        'name' => 'prova',
        //'type' => 'SecureDraw\Form\Element\ProvaElement',
        'type' => 'Test',    //Fail
    ));
在我的行动中:

    $formManager = $this->serviceLocator->get('FormElementManager');
    $form    = $formManager->get('SecureDraw\Form\UserForm');
    $prova = $form->get('prova');
    echo $prova->hola();

问题是,通过FormElementManager创建的元素必须被创建到init方法中,而不是构造方法中,它在这里可以看到什么

解决方法解释得很糟糕

: 在您自己的模块中,创建以下两个文件:

  • FormElementManagerConfig使用自定义表单元素的可调用短名称
  • 子类Form\Factory并重写getFormElementManager,并将配置传递给FormElementManager构造函数 然后,您可以使用自己的工厂创建表单,如下所示(您可以将一个非常基本的,例如空数组,或一个或多或少成熟的$spec传递给$Factory->createForm()):

    FormElementManagerConfig.php:

    class FormElementManagerConfig implements ConfigInterface
    {
        protected $invokables = array(
            'anything'          => 'MyModule\Form\Element\Anything',
        );
    
        public function configureServiceManager(ServiceManager $serviceManager)
        {
            foreach ($this->invokables as $name => $service) {
                $serviceManager->setInvokableClass($name, $service);
            }
        }
    }
    
    MyFactory.php:

    class Factory extends \Zend\Form\Factory
    {
        public function getFormElementManager()
        {
            if ($this->formElementManager === null) {
                $this->setFormElementManager(new FormElementManager(new FormElementManagerConfig()));
            }
            return $this->formElementManager;
        }
    } 
    

    您是否在顶部指定了use SecureDraw\Form\Element\或类似的东西,如果没有,请指定名称空间的使用,这可能会避免此问题,错误明确表示无法找到您尝试实例化的类。这仍然是必需的吗?所有的文档都让它听起来像是一个
    form_elements
    factory/invokable,应该让定制元素开箱即用,但是我看到了您对ZF贡献者的贡献,看起来没有任何变化。此页面现在不可用。
    class Factory extends \Zend\Form\Factory
    {
        public function getFormElementManager()
        {
            if ($this->formElementManager === null) {
                $this->setFormElementManager(new FormElementManager(new FormElementManagerConfig()));
            }
            return $this->formElementManager;
        }
    }