Zend framework2 Zend Framework 2 FormElementManager工厂不工作

Zend framework2 Zend Framework 2 FormElementManager工厂不工作,zend-framework2,zend-form-element,Zend Framework2,Zend Form Element,请帮助我使用Zend framework 2:) 我想使用表单元素管理器(绝对类似)创建一个包含字段集集合的表单 我的FormElementManager配置: 'form_elements' => array( 'factories' => array( 'Admin\Form\TaskForm' => function($sm) { $form = new TaskForm(); $doctrimeEn

请帮助我使用Zend framework 2:)

我想使用表单元素管理器(绝对类似)创建一个包含字段集集合的表单

我的FormElementManager配置:

'form_elements' => array(
    'factories' => array(
        'Admin\Form\TaskForm' => function($sm) {
            $form = new TaskForm();
            $doctrimeEntityManager = $sm->getServiceLocator()->get('Doctrine\ORM\EntityManager');
            $form -> setEntityManager($doctrimeEntityManager);
            $form -> init();
            return $form;
        },
        'Admin\Form\TaskbrandFieldset' => function($sm) {
            $doctrimeEntityManager = $sm->get('Doctrine\ORM\EntityManager');
            $form = new TaskbrandFieldset();
            $form->setEntityManager($doctrimeEntityManager);
            return $form;
        },
    )
),
Admin\Form\TaskForm(仅问题部分):

Admin\Form\TaskbrandFieldset:

namespace Admin\Form;

use Admin\Entity\Taskbrand;
use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;
use Zend\Stdlib\Hydrator\ClassMethods as ClassMethodsHydrator;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class TaskbrandFieldset extends Fieldset implements InputFilterProviderInterface, ServiceLocatorAwareInterface {

protected $entityManager;
protected $serviceLocator;

public function init() {
    $this->setName('TaskbrandFieldset');
    $this->setHydrator(new ClassMethodsHydrator(false))
            ->setObject(new Taskbrand());

    $this->setLabel('Taskbrand');

    $this->add(array(
        'type' => 'DoctrineModule\Form\Element\ObjectSelect',
        'name' => 'brand',
        'options' => array(
            'object_manager' => $this->getEntityManager(),
            'target_class' => 'Module\Entity\Brand',
            'property' => 'name',
        ),
    ));

}
}
最后,我的控制器:

 $Task = $this->getServiceLocator()->get('Admin\Model\Task')->findByPk($id);
 $formManager = $this->getServiceLocator()->get('FormElementManager');
 $form =  $formManager->create('Admin\Form\TaskForm');
 $form->bind($Task);
问题在于表单Admin\form\TaskForm在表单元素配置部分描述的工厂中实例化,但Admin\form\TaskbrandFieldset没有实例化。它只是调用

试图理解这个问题,我发现Admin\Form\TaskForm和Admin\Form\TaskbrandFieldset使用不同的FormElementManager实例进行实例化,第一个实例中包含我的配置(包括工厂描述),而第二个实例中没有任何配置


请帮助我:)

问题出在你的控制器上。使用

$form = $formManager->get('Admin\Form\TaskForm');
而不是

$form = $formManager->create('Admin\Form\TaskForm');

记住,您不必使用$form->init()。它是自动调用的,就像在zf1中一样。关于

FormElementManager是如何创建表单元素的,有一个很好的教程;)使用一个普通的服务工厂来创建我已经尝试过的表单(Service_manager=>factories)。如果使用正常的服务工厂(在控制器$this->getServiceLocator()->get('Admin\Form\TaskForm'),TaskForm将正确实例化,但Admin\Form\TaskbrandFieldset仍将使用FormElementManager实例化,而不进行配置。在他们使用FormElementManager.Hmm时,我个人按照中指出的那样做,并简单地在我的表单中实例化字段集,它已经知道EntityManager,因此很容易传递它。
$form = $formManager->create('Admin\Form\TaskForm');