3

我在这里创建自定义元素:ZF2Docs: Advanced use of Forms

1.在Application/Form/Element/CustomElement.php中创建CustomElement类

2.添加到我的Module.php函数

public function getFormElementConfig()
{
    return array(
        'invokables' => array(
            'custom' => 'Application\Form\Element\CustomElement',
        ),
    );
}

如果我使用 FQCN 它工作正常:

$form->add(array(
    'type' => 'Application\Form\Element\CustomElement',
    'name' => 'myCustomElement'
));

但如果我使用短名称:

$form->add(array(
    'type' => 'Custom',
    'name' => 'myCustomElement'
));

抛出异常:

Zend\ServiceManager\ServiceManager::get was unable to fetch or create 
an instance for Custom
4

1 回答 1

4

问题

该错误可能是由于您实例化$form对象的方式。如果您只使用new Zend\Form\Form表达式或类似的东西,则不会使用正确的服务定位器设置表单。

$form = new \Zend\Form\Form;
$form->add(array(
    'type' => 'custom',
    'name' => 'foobar',
));

解决方案

这里的技巧是使用FormElementManager服务定位器来实例化表单。

// inside a controller action
$form = $this->getServiceLocator()->get('FormElementManager')->get('Form');
$form->add(array(
    'type' => 'custom',
    'name' => 'foobar',
));

更好的是,form()在您的控制器中定义一个方法作为为您执行此操作的快捷方式:

class MyController extends AbstractActionController
{
    public function form($name, $options = array())
    {
        $forms = $this->getServiceLocator()->get('FormElementManager');
        return $forms->get($name, $options);
    }

    public function createAction()
    {
        $form = $this->form('SomeForm');
        // ...
    }
}

解释

每个表单对象都附加到表单工厂,该表单工厂又附加到服务定位器。该服务定位器负责获取所有用于实例化新表单/元素/字段集对象的类。

如果您实例化一个新的表单对象(全部单独),则会实例化一个空白服务定位器并用于获取该表单中的后续类。但是随后的每个对象都附加到同一个服务定位器。

这里的问题是getFormElementConfig配置了这个服务定位器的一个非常具体的实例。这是FormElementManager服务定位器。配置完成后,从此服务定位器中提取的所有表单都将附加到此服务定位器,并将用于获取其他元素/字段集等。

希望这可以解决您的问题。

于 2013-04-09T06:48:20.840 回答