Php 使用工厂为字段集创建表单–;如何将两者联系起来?

Php 使用工厂为字段集创建表单–;如何将两者联系起来?,php,zend-framework2,Php,Zend Framework2,我想在Zend Framework 2中使用工厂创建的字段集创建一个表单,但在将字段集与表单连接时遇到问题 字段集的创建方式如下: <?php // File: module/FormElements/src/Form/PersonalDataFieldset.php namespace FormElements\Form; use Zend\Form\Factory; class PersonalDataFieldset extends Factory { publ

我想在Zend Framework 2中使用工厂创建的字段集创建一个表单,但在将字段集与表单连接时遇到问题

字段集的创建方式如下:

<?php    
// File: module/FormElements/src/Form/PersonalDataFieldset.php

namespace FormElements\Form;

use Zend\Form\Factory;

class PersonalDataFieldset extends Factory
{
    public function __construct()
    {
        $factory = new Factory();
        $form = $factory->createForm(array(
            'fieldsets' => array(
                array(
                    'spec' => array(
                        'name' => 'data',
                        'options' => array(
                            'label' => 'Fieldset Test',
                        ),
                        'elements' => array(
                            array(
                                'spec' => array(
                                    'name' => 'fname',
                                    'type' => 'text',
                                ),
                            ),
                            array(
                                'spec' => array(
                                    'name' => 'lname',
                                    'type' => 'text',
                                ),
                            ),
                            array(
                                'spec' => array(
                                    'name' => 'email',
                                    'type' => 'email',
                                ),
                            ),
                        ),
                    ),
                ),
            ),
        ));
    }
}

我会避免调用
$form=newpersonaldataform()在控制器中

我会把依赖注入工厂,工厂应该有权访问“FormElementManager”

FormElementManager是一个AbstractPluginManager,您可以在其中存储所有与表单相关的服务,包括元素、字段集和完整表单(因为它们都扩展了Zend\form\Element)

通过从插件管理器调用表单服务(并确保将插件管理器注入任何后续表单工厂),您将不会遇到这些“无效插件”错误


“无效插件”异常通常指以下两种情况之一。您没有向插件管理器注册您的元素,或者您没有正确地将插件管理器插入您需要的位置。

我将避免调用
$form=new PersonalDataForm()在控制器中

我会把依赖注入工厂,工厂应该有权访问“FormElementManager”

FormElementManager是一个AbstractPluginManager,您可以在其中存储所有与表单相关的服务,包括元素、字段集和完整表单(因为它们都扩展了Zend\form\Element)

通过从插件管理器调用表单服务(并确保将插件管理器注入任何后续表单工厂),您将不会遇到这些“无效插件”错误


“无效插件”异常通常指以下两种情况之一。您没有向插件管理器注册您的元素,或者您没有正确地将插件管理器插入您需要的位置。

我将避免调用
$form=new PersonalDataForm()在控制器中

我会把依赖注入工厂,工厂应该有权访问“FormElementManager”

FormElementManager是一个AbstractPluginManager,您可以在其中存储所有与表单相关的服务,包括元素、字段集和完整表单(因为它们都扩展了Zend\form\Element)

通过从插件管理器调用表单服务(并确保将插件管理器注入任何后续表单工厂),您将不会遇到这些“无效插件”错误


“无效插件”异常通常指以下两种情况之一。您没有向插件管理器注册您的元素,或者您没有正确地将插件管理器插入您需要的位置。

我将避免调用
$form=new PersonalDataForm()在控制器中

我会把依赖注入工厂,工厂应该有权访问“FormElementManager”

FormElementManager是一个AbstractPluginManager,您可以在其中存储所有与表单相关的服务,包括元素、字段集和完整表单(因为它们都扩展了Zend\form\Element)

通过从插件管理器调用表单服务(并确保将插件管理器注入任何后续表单工厂),您将不会遇到这些“无效插件”错误


“无效插件”异常通常指以下两种情况之一。您没有向插件管理器注册您的元素,或者您没有正确地将插件管理器插入您需要的位置。

将您的字段和字段集添加方法从
\u construct()
移动到
init()
方法,并使用FormElementManager抓取您的表单。它的工作方式与这里描述的自定义元素的工作方式相同

编辑1:我修复了链接,似乎#符号编码正确

编辑2:以下是ZF2文档中的零件报价:

…自定义元素的示例代码

现在是第一个陷阱

如果您是通过扩展Zend\form\form来创建form类,则不能将自定义元素添加到_-construct-or中(正如我们在上一个示例中使用自定义元素的FQCN所做的那样),而是添加到init()方法中:

第二个问题是,您不能直接实例化form类,而是通过Zend\form\FormElementManager获取它的实例:

这样做的最大好处是,如果任何内置Zend Framework表单元素不适合您的需要,您可以轻松地重写它们。例如,如果要创建自己的电子邮件元素而不是标准元素,只需创建元素并使用与要替换的元素相同的键将其添加到表单元素配置中即可


将字段和字段集添加方法从
\u construct()
移动到
init()
方法,并使用FormElementManager获取表单。它的工作方式与这里描述的自定义元素的工作方式相同

编辑1:我修复了链接,似乎#符号编码正确

编辑2:以下是ZF2文档中的零件报价:

…自定义元素的示例代码

现在是第一个陷阱

如果您是通过扩展Zend\form\form来创建form类,则不能将自定义元素添加到_-construct-or中(正如我们在上一个示例中使用自定义元素的FQCN所做的那样),而是添加到init()方法中:

第二个问题是,您不能直接实例化form类,而是通过Zend\form\FormElementManager获取它的实例:

这样做的最大好处是,如果任何内置Zend Framework表单元素不适合您的需要,您可以轻松地重写它们。例如,如果要创建自己的电子邮件元素而不是标准元素,只需创建元素并使用与要替换的元素相同的键将其添加到表单元素配置中即可


将字段和字段集从
\uu construct()
移动到
init()
<?php
// File: module/FormElements/src/Form/PersonalDataForm.php

namespace FormElements\Form;

use Zend\Form\Form;

class PersonalDataForm extends Form
{
    public function __construct()
    {
        parent::__construct();

        // Field not contained in the fieldset - this works
        $this->add(array(
            'name'=> 'some-name',
            'type' => 'text',
            'options' => array(
                'label' => 'Test Label',
            ),
        ));

        // Here I am trying to add the fieldset – this does not work
        $this->add(array(
            'name' => 'some-other-name',
            'type' => 'FormElements\Form\PersonalDataFieldset',
        ));
    }
}
<?php
// File: module/FormElements/src/Controller/FormElementsController.php

namespace FormElements\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

use FormElements\Form\PersonalDataForm;

class FormElementsController extends AbstractActionController
{
    public function indexAction()
    {
        $form = new PersonalDataForm();

        return new ViewModel(array(
            'form' => $form
        ));
    }
}
namespace Application\Form;

use Zend\Form\Form;

class MyForm extends Form
{
    public function init()
    {
        $this->add(array(
            'name' => 'phone',
            'type' => 'Phone',
        ));
    }
 }
namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;

class IndexController extends AbstractActionController
{
    public function indexAction()
    {
        $sl = $this->getServiceLocator();
        $form = $sl->get('FormElementManager')->get('\Application\Form\MyForm');
        return array('form' => $form);
    }
}