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
关键字创建它,你的工厂将不会被触发。
我需要为字段集使用工厂。我知道如何为表单做,但如何为字段集做?
表单代码为:
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
关键字创建它,你的工厂将不会被触发。