【问题标题】:Why does not work short names when I create custom form elements in Zend Framework 2?为什么在 Zend Framework 2 中创建自定义表单元素时短名称不起作用?
【发布时间】:2023-03-20 11:49:01
【问题描述】:

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

【问题讨论】:

  • @AydinHassan 这到底有什么关系? :D @Ildar,只是为了确保 Elements 类被称为 CustomElement 而不是 Custom
  • @Sam,是的,Elements 类叫做 CustomElement
  • 我已经更改了可调用对象中 customElement 上的自定义,它可以正常工作。

标签: zend-framework zend-framework2


【解决方案1】:

问题

该错误可能是由于您实例化$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 服务定位器。配置完成后,从此服务定位器中提取的所有表单都将附加到此服务定位器,并用于获取其他元素/字段集等。

希望这能解决您的问题。

【讨论】:

  • 谢谢!第一个问题是 invokables 部分是“custom”而不是“customElement”。第二个问题是您所说的:没有设置正确的服务定位器。我使用表单工厂在视图中创建表单。所以,我打电话给 $factory->setFormElementManager($sm->get('FormElementManager'));在视图中
猜你喜欢
  • 1970-01-01
  • 2013-03-21
  • 2012-09-04
  • 1970-01-01
  • 2012-12-05
  • 2013-02-15
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多