0

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

我尝试将zend 文档步骤的相同示例复制到步骤,但它不起作用。

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

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

2 回答 2

1

问题是通过 FormElementManager 创建的元素必须创建到 init 方法中,而不是 __Construct 方法如何在此页面中看到。

Zend文档解释得很糟糕

于 2013-03-31T18:46:45.177 回答
0

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

  1. 带有自定义表单元素的可调用短名称的 FormElementManagerConfig;
  2. 子类 Form\Factory 并覆盖 getFormElementManager 并将配置传递给 FormElementManager 构造函数;

然后你使用你自己的工厂来创建你的表单,就像这样(你可以传递一个非常基本的,例如空数组,或者一个或多或少完整的 $spec 到 $factory->createForm()):

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

我的工厂.php:

class Factory extends \Zend\Form\Factory
{
    public function getFormElementManager()
    {
        if ($this->formElementManager === null) {
            $this->setFormElementManager(new FormElementManager(new FormElementManagerConfig()));
        }
        return $this->formElementManager;
    }
} 
于 2014-02-03T21:49:05.467 回答