ZF3中如何触发fieldset工厂

How to trigger fieldset factory in ZF3

我需要为字段集使用工厂。我知道如何为表单做,但如何为字段集做?

表单代码为:

namespace Application\Form;

use Application\Fieldset\Outline;
use Zend\Form\Element;
use Zend\Form\Form;

class Message extends Form
{
    public function __construct()
    {
        parent::__construct('message'); 
        $this->setAttribute('method', 'post');    
        $this->add([
            'type' => Outline::class,
            'options' => [
                'use_as_base_fieldset' => true,
            ],
        ]);
        $this->add([
            'name' => 'submit',
            'attributes' => [
                'type' => 'submit',
                'value' => 'Send',
            ],
        ]);
    }
}

正如我们在行上方看到的那样,'type' => Outline::class, 告诉解析器创建字段集对象。但是如何告诉解析器使用自定义字段集工厂创建字段集对象?

FormElementManager 是从 ServiceManager 扩展而来的,因此您必须像服务管理器一样配置它。这是一个例子

class MyModule {
     function getConfig(){
           return [
               /* other configs */
               'form_elements' => [   // main config key for FormElementManager
                   'factories' => [
                        \Application\Fieldset\Outline::class => \Application\Fieldset\Factory\OutlineFactory::class
                   ]
               ]
               /* other configs */
           ];
     }
}

使用此配置,当您调用 \Application\Fieldset\Outline::class 时,\Application\Fieldset\Factory\OutlineFactory::class 将由 FormElementManager 触发。一切都与 ServiceManager 相同。您将通过服务管理器调用您的字段集;

$container->get('FormElementManager')->get(\Application\Fieldset\Outline::class);

您也可以通过getFormFactory方法在forms/fieldsets中调用它;

function init() { // can be construct method too, nothing wrong
   $this->getFormFactory()->getFormElementManager()->get(\Application\Fieldset\Outline::class);
}

当然,您可以在 factory-backed 表单扩展中使用它的名称。

但是如果你通过new关键字创建它,你的工厂将不会被触发。