Zend Framework 2使用ServiceManager的自定义元素不起作用

时间:2013-03-30 20:25:11

标签: zend-framework2 zend-form zend-form-element servicemanager

我想创建一个自定义元素并使用短名称将元素添加到Form中,使用新的ServiceManager tecnique for ZF2 V.2.1 +

我尝试将zend documentation步骤的相同样本复制到步骤但不起作用。

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

    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();

2 个答案:

答案 0 :(得分:1)

问题是通过FormElementManager创建的元素必须创建为init方法,而不是__Construct方法,它可以在page中看到。

zend documentation被严重解释

答案 1 :(得分:0)

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

  1. FormElementManagerConfig,包含自定义表单元素的invokables短名称;
  2. Subclass Form \ Factory并覆盖getFormElementManager并将配置传递给FormElementManager构造函数;
  3. 然后你使用你自己的工厂来创建你的表格,就像这样(你可以传递一个非常简陋的,例如空数组,或者或多或少完全成熟的$ spec到$ factory-&gt; createForm()):< / p>

    $factory = new Factory();
    $spec    = array();
    $form    = $factory->createForm($spec);
    

    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;
        }
    }