gpt4 book ai didi

zend-framework - 为什么在 Zend Framework 2 中创建自定义表单元素时短名称不起作用?

转载 作者:行者123 更新时间:2023-12-01 12:46:02 25 4
gpt4 key购买 nike

我在这里创建自定义元素: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

最佳答案

问题

错误可能是由于您如何实例化 $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',
));

更好的是,在您的 Controller 中定义一个 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 服务定位器。配置完成后,从此服务定位器中提取的所有表单将附加到此服务定位器,并将用于获取其他元素/字段集等。

希望这能解决您的问题。

关于zend-framework - 为什么在 Zend Framework 2 中创建自定义表单元素时短名称不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15890374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com